`

java流的总结——从原理分析

阅读更多

   温故而知新,可以为师矣。至于你信不信,反正我是信了。知识这个东西吗,学了忘,忘了学,和正常,最近实习被各种UI界面搞的头寻目眩,主要有fragmentTabhost,ViewPager,Adapter,自定义控件,侧滑菜单。现在完成了界面开发后我想利用一点时间完成io流的回顾,数据交互时不可避免的需要写数据到网络和本地。

 

    正式开始:java程序怎么获取本地文件(字符文件,二进制文件)或者文件夹呢?Jdk提供了文件File类行驶这个功能。

File类译为:联系,File类实例化有多个构造函数。

 

File(File parent, String child) 
          根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 
File(String pathname) 
          通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 
File(String parent, String child) 
          根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 
File(URI uri) 
          通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。 

 System.out.println(File.separator);//文件分割符,在windows下输出\字符串

 

 关联一个文件:File file=new File("F:\\xp\test\\2.jpg");为什么两个反斜杠呢?资源管理器打开的方式是:F:\xp\test。这是因为:\本身是标志一个转义字符,\r,\n。所以是双反斜杠。

 

在java里关联时,一般这样:File file2=new File("F:/xp/test/2.jpg");

 

    2、已知File类有isDirectory(),lisfFiles()方法,用递归的方式,遍历出这个文件夹下的所有的子文件和文件夹

 

 

//输出一个文件夹的子孙及文件和文件夹
public class Demo4 {

	public static void main(String[] args) {
		File path=new File("F:/xp/test");
		test(path);
	}
	
	public static void test(File file){
		if(file==null){
			return;
		}
		System.out.println(file.getAbsolutePath());
		if(file.isDirectory()){
			for(File src:file.listFiles()){
				test(src);
			}
		}
	}
	
}

 是不是很短小精悍,提供形参:File,输出你的绝对路径,如果你是目录的话,遍历这个目录下一级的文件和文件夹。并且判断他们里面有没有文件夹,有求继续遍历文件夹,递归的出口就是isDirectory()不成立。

 

 

拓展:打印一个盘符下的文件和文件夹

File[] roots=path.listRoots();

对roots数组test(file)就可以了。

 

 

3、介绍完了“联系后”,接下来我们就要实现数据如何通过在java.class里流入或者流出文件。

   我们从字节流和字符流的角度来介绍:

   字节流:抽象类:InputStream,OutputStream。画图吧;语言表达太差了,真是日了狗了。

    

 

遵循一个原则,以程序为中心,输入到程序里的是输入流。从程序输出的流是输出流

 

package com.lin.bytearray;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

//ByteArray的输入输出

public class ByteArrayDemo01 {

	public static void main(String[] args) throws Exception {
		read(write());
	}
	
	public static void  read(byte[] src) throws Exception{
	 
		
		InputStream is=new BufferedInputStream(new ByteArrayInputStream(src));
		
		int len=0;
		
		byte[] buffer=new byte[1024];
		
		while(-1!=(len=is.read(buffer))){
			System.out.println(new String(buffer,0,len));
		}
		is.close();//这个可以不要关闭
	}
	
	
	public static byte[] write() throws IOException{
		byte[] dest;
		ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
		String str="我爱java,不爱搞基我爱java,不爱搞基fesfsgsggggggggg";
		byte[] info=str.getBytes();
		byteArrayOutputStream.write(info, 0, info.length);
		dest=byteArrayOutputStream.toByteArray();
		byteArrayOutputStream.close();
		return dest;
	}
}

 ByteArrayOutputStream是OutputStream的子类。把字符串数据写给了数组。注意我刚才画的图,数据源不一定是文件,也可以是数组,网络。。。。。

buffer数组是一个杯子,装了1024滴的水,当没有装满(没有水滴可以装了),或者说装满该倒了,就返回-1。

     以上程序的输出为:

我爱java,不爱搞基我爱java,不爱搞基fesfsgsggggggggg

     而如果,换成一个小杯子:只能装10滴水,就要梅十个字节就打印:而一个汉字代表两个字节

  输出:

不爱搞基我
爱java,不
爱搞基fesf
sgsggggggg
gg

是不是很爽,还是要把原理摸清楚

 

4、程序,文件,数组三者之间的数据流动

package com.lin.bytearray;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class ByteArrayDemo02 {

	//字节数组-程序-文件
	public static void main(String[] args) throws Exception {
		byte[] datas=getBytesFromFile("F:/xp/test/1.txt");
		System.out.println(new String(datas));
		toFileFromByteArray(datas, "F:/xp/test/arrs.txt");
	}
	//文件-程序-字节数组
	public static byte[] getBytesFromFile(String srcPath)throws Exception{
		File src=new File(srcPath);
		byte[] dest=null;
		InputStream is=new BufferedInputStream(new FileInputStream(src));
		ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
		
		byte[] flsh=new byte[1024];
		int len=0;
		while(-1!=(len=is.read(flsh))){
			byteArrayOutputStream.write(flsh, 0, len);
		}
		byteArrayOutputStream.flush();
		dest=byteArrayOutputStream.toByteArray();
		byteArrayOutputStream.close();
		is.close();
		return dest;
	}
	
	public static void toFileFromByteArray(byte[] src,String destPath)throws Exception{
 		
		InputStream is=new BufferedInputStream(new ByteArrayInputStream(src));
		OutputStream os=new BufferedOutputStream(new FileOutputStream(new File(destPath)));
		byte[] buffer=new byte[1024];
		int len=0;
		while(-1!=(len=is.read(buffer))){
			os.write(buffer, 0, len);
		}
		os.flush();
		os.close();
		is.close();
 	}
	
}

 

还要注意一点,字符流只操作字符串,用他傻逼地操作图片文件结果就是指定目录下文件生成了,却没有内容。。。

 

好了,以上就是我的一点回顾和总结了,与君共勉,评论一下,点个赞哦

 

 

 

  • 大小: 12.2 KB
分享到:
评论
1 楼 麦田的设计者 2015-09-24  
   在模块三中我的数组是byte[] buffer=new byte[10].结果一下输出不完分批输出了。
不爱搞基我
爱java,不
爱搞基fesf
sgsggggggg
gg
我解释说一个汉字占两个字节,字符占一个字节,说的不对。
一个汉字占两个字节是在编译器为gbk编码方式的情况下。
当eclipse的编码方式为utf-8,一个汉字就占三个字节了,此时的输出
我爱java
,不爱�
��基我�
�java,�
�爱搞基
fesfsgsggg
gggggg

相关推荐

    java学习小总结——画图板制作(附代码)

    本篇小结将聚焦于如何使用Java实现一个基本的画图板,同时提供相关的源码分析。 1. Java GUI基础 Java提供了丰富的类库用于创建GUI,主要在java.awt和javax.swing包下。在这个项目中,我们可能会使用`JFrame`作为主...

    java实现词法分析器——编译原理实验

    在这个实验中,我们将使用Java语言来实现一个词法分析器,它能够处理关键字、运算符、分界符、标识符、常数以及未识别的符号。 首先,词法分析器的核心任务是识别源代码中的各种元素。对于Java而言,关键字如`...

    Java与模式——源码

    在"src"文件夹中,可能包含了以上设计模式的Java源代码实现,通过阅读和分析这些代码,你可以深入了解每个模式的结构、工作原理以及在实际项目中的应用。此外,学习源码也能帮助你提高代码阅读能力,增强对Java语法...

    java毕业设计——学生住宿管理系统JAVA.zip

    【标题】"java毕业设计——学生住宿管理系统JAVA.zip"是一个基于Java编程语言的毕业设计项目,旨在实现一个针对学生住宿管理的功能完善的系统。这个系统可能包括了对学生住宿信息的添加、修改、查询等一系列操作,是...

    JAVA课程设计——java宝石连连看游戏源代码

    【描述】:“java宝石连连看游戏源代码课程设计——课程设计——”强调了这是一项以实际项目为驱动的教学活动,通过分析和修改已有的源代码,学习者可以深入理解游戏开发的核心技术和Java编程的实践应用。...

    JAVA修改工具——JavaMagic

    JavaMagic的核心原理是利用Java的字节码操作,即在Class文件级别进行工作,这使得它能够深入到Java运行时环境的底层。 在Java编程中,源代码会被编译成字节码,这是一种平台无关的中间表示,由Java虚拟机(JVM)...

    java毕业设计——java+mysql crm客户关系管理系统.zip

    "java毕业设计——java+mysql crm客户关系管理系统.zip"这个标题表明了一个基于Java技术的毕业设计项目,该项目的核心是构建一个CRM(Customer Relationship Management)系统,利用MySQL作为数据库来存储和管理客户...

    《C++基础教程——从问题分析到程序设计》

    《C++基础教程——从问题分析到程序设计》是一本旨在引导初学者深入理解C++编程语言的书籍,它不仅涵盖了C++的基础概念,还强调了如何从问题分析到程序设计的完整过程。这本书的内容丰富,包括了各种实例和练习题,...

    java_贪吃蛇——

    在本项目中,我们探索的是一个基于Java编程语言实现的经典游戏——贪吃蛇。贪吃蛇游戏是一款简单有趣且极具挑战性的游戏,它通常在控制台或者图形界面上进行,玩家通过控制蛇的方向来捕食食物,每吃掉一个食物,蛇的...

    编译原理课程设计——词法语法分析器

    在这个“编译原理课程设计——词法语法分析器”项目中,我们将深入探讨编译器的核心组件,即词法分析器和语法分析器,并了解first集、follow集和select集等概念。 词法分析是编译器的第一步,它负责将源代码分解为...

    java实验报告——简单计算器的编写.docx

    Java 实验报告——简单计算器的编写 Java 语言是开发图形用户界面(GUI)的不二之选,本实验报告旨在通过编写简单计算器的程序,掌握 Java 图形用户界面(GUI)的设计原理和程序结构,并熟悉常用组件的事件接口。 ...

    编译原理实验1——词法分析器设计

    词法分析器的任务是从源代码中识别出一个个有意义的单元,称为记号(Token),为后续的语法分析做准备。 在这个实验中,我们将使用Java语言来实现一个基本初等函数的词法分析器。Java是一种广泛使用的、面向对象的...

    JAVA记事本源码——code

    这个项目的主要目的是为了教学目的,让学生或者初学者能够理解Java GUI(图形用户界面)编程的基本原理,以及如何处理文件读写操作。下面将详细探讨这个源码中的关键知识点。 1. **Swing库的使用** Java记事本源码...

    实战Java虚拟机——JVM故障诊断与性能优化.pdf

    《实战Java虚拟机——JVM故障诊断与性能优化》是一本深入探讨Java开发中的关键环节——Java虚拟机(JVM)的专著。本书聚焦于实际应用中的问题解决和性能调优,对于Java开发者和系统管理员来说,是提升技术水平的重要...

    java毕业设计——基于J2EE的B2C电子商务系统开发

    【Java毕业设计——基于J2EE的B2C电子商务系统开发】 在计算机科学与技术领域,尤其是软件工程专业,毕业设计是一项重要的实践性学习环节,它要求学生将所学理论知识应用于实际项目中,以检验和提升自己的技能。本...

    java反编译器——jad

    它能够将已编译的.class文件转换回接近源代码的高级语言形式,尽管它生成的代码通常不会与原始Java源代码完全相同,但对于我们理解程序的工作原理、逆向工程或学习他人的代码实现来说,是非常有用的。 JAD的使用并...

    Java词法分析器——C语言实现

    总的来说,这个项目提供了一个实践性的例子,展示如何用C语言手动构建一个Java词法分析器,对于学习编译原理和理解编译器工作原理的人来说,这是一个宝贵的学习资源。通过阅读源代码和实验报告,我们可以深入理解...

    java源码:Java局域网通信——飞鸽传书源代码.rar

    Java局域网通信技术是Java编程领域中的一个...通过分析和学习"飞鸽传书"的源代码,开发者可以掌握Java局域网通信的核心技术,为构建更复杂的应用打下坚实的基础。这不仅有助于理解网络编程原理,还能提升实际开发能力。

    JAVA初级教程——Web系统开发技术与方法

    【JAVA初级教程——Web系统开发技术与方法】涵盖了Web编程的多个核心领域,旨在帮助初学者建立起完整的Web系统开发知识体系。以下是对每个知识点的详细解释: 1. **Web编程基本知识**: - **HTML**是超文本标记...

    smali2java——直接将smali转换成java

    标题"smali2java——直接将smali转换成java"揭示了本文的核心主题,即一个名为"smali2java"的工具,它的主要功能是将编程语言Smali转换为Java。Smali是一种低级的、汇编式的语言,通常用于Android应用的逆向工程,而...

Global site tag (gtag.js) - Google Analytics