节点流

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fighting123678/article/details/84253496

可以直接从某一个数据源/数据节点进行读写的流


一、文件节点流

1、实例1:TestFileInputStream  按字节读取文件并且输出到控制台

import java.io.*;

public class TestFileInputStream 
{
	public static void main(String[] args) 
	{
		int b=0;
		FileInputStream in=null;//可能会抛出一个已检查异常//别忘记导入包
		try
		{
			in=new FileInputStream("TestFileInputStream.java");//不建议这种形式
			//in=new FileInputStream("E:\\workplace\\KeJian\\bin\\TestFileInputStream.java");//建议这种形式
			/*
			 * 这个文件是用字符串表达的文件
			 * 一般最好是用E:\\workplace\\KeJian\\bin\\TestFileInputStream.java(用两个双斜杠是因为转义字符问题), 这样限定死的形式写的,也就是明确路径
			 * 但是这里没有限定死,也就是没有指定路径,而是给出了一个文件名
			 * 这样的话,这个文件的默认路径就是与bin和src同级文件的路径
			 * */
		}
		catch(FileNotFoundException e)
		{
			System.out.println("找不到指定文件");
			//e.printStackTrace();
			/*
			 * 这里主要是为了在调试阶段,便于看有什么错误信息的但是在真正的生产产品的时候
			 * 但是在真正生产出产品的时候,还是需要用上面System.out.println的方式给出错误提示
			 * 因为用户是看不懂你的这个错误是什么意思,只能简便的提示用户,到底是什么错误
			 * */
			System.exit(-1);//直接退出程序
		}
		try//如果通过的话
		{
			long num=0;
			while((b=in.read())!=-1)//每次读一个字节给b,-1的意思是已经读到文件结尾了
			{
				System.out.print((char)b);//read的返回值是int类型的
				num++;//统计多少个字节
			}
			System.out.println();
			System.out.println("共读取了"+num+"个字节");
		}
		catch(IOException e)//read会出这个异常
		{
			System.out.println("文件读取错误");
		}
		finally//是一个保护代码,里面的内容是必须要执行的
		{
			try
			{
				in.close();//这里就体现了为什么要在try外面命名in,因为,这样就可以访问in,调用close方法,关闭掉流
			}
			catch(IOException e)//close也可能会抛异常
			{
				System.out.println("关闭文件错误");
			}
		}
	}
}

用命令窗口运行的时候

 意思是编译这个文件下的所有java文件

打开这个文件之后,才能运行生成的class程序

运行结果是中文全是问号,英文字符照常读取

      总共读取的字节数和java文件的大小一致,都是1800个字节

   cls是清屏功能

2、中文为什么都是问号呢?

因为,中文一般都是jbk编码的,jbk编码的时候,两个字节表示一个字符(中文),但是每次只能读一个字节,这个时候就会出问题。

简言之:中文一般是2—3个字节,但是输出的时候,一次只能读1个字节,所以,每次读取一个字符的时候会出问题。因为,一个字节无法表示一个字符,所以中文变成了问号。


3、如何修改才能不出现问号呢?

实例2:TestFileReader  按字符读取文件,并且输出到控制台

功能:打印出一个文件中的全部字符(Unicode编码)

java是纯文本文件,所以用字符流(每次读一个字符)就可以不出现问号的情况了,字符流也是读取字节,只不过,在字符流能在字节之上,再进行转换,自动转换成字符,因此从字符流中读出来的是字符。

import java.io.*;

/*
 * 功能:从TestFileRreaer.java中读取字符,然后打印到控制台。
 * 说明:中文可以正常显示,因为采用的是FileReader读取字符。
 * */
public class TestFileReader 
{
	public static void main(String[] args) 
	{
		int b=0;
		FileReader fr=null;//可能会抛出一个已检查异常//别忘记导入包
		int c=0;
		try
		{
			fr=new FileReader("TestFileReader.java");
			int ln=0;
			while((c=fr.read())!=-1)//没有读到文件结尾
			{
				System.out.println((char)c);
				ln++;
			}
			System.out.println("共读取了"+ln+"个字符");
		}
		catch(FileNotFoundException e)
		{
			System.out.println("找不到指定文件");
		}
		catch(IOException e)
		{
			System.out.println("文件读取错误");
		}
		finally//是一个保护代码,里面的内容是必须要执行的
		{
			try
			{
				fr.close();//这里就体现了为什么要在try外面命名in,因为,这样就可以访问in,调用close方法,关闭掉流
			}
			catch(IOException e)//close也可能会抛异常
			{
				System.out.println("关闭文件错误");
			}
		}
	}
}

运行结果是

中文正常读取,一共843个字符


4、文件一个字节一个字节地实现拷贝

实例3:TestFileOutputStream  

—FileOutputStream对象建立时,若文件不存在,则自动建立。

import java.io.*;

public class TestFileOutputStream 
{
	public static void main(String[] args) 
	{
		int b=0;
		FileInputStream in=null;//可能会抛出一个已检查异常//别忘记导入包
		FileOutputStream out=null;
		try
		{
			in=new FileInputStream("HelloWorld.java");
			out=new FileOutputStream("newHello.java");
			while((b=in.read())!=-1)
			{
				out.write(b);//读完之后,写到newHello.java这个文件中去
			}
		}
		catch(FileNotFoundException e2)
		{
			System.out.println("找不到指定文件");
			System.exit(-1);//直接退出程序
		}
		catch(IOException e1)
		{
			System.out.println("文件复制错误");
		}
		finally//是一个保护代码,里面的内容是必须要执行的
		{
			try
			{
				in.close();//这里就体现了为什么要在try外面命名in,因为,这样就可以访问in,调用close方法,关闭掉流
			}
			catch(IOException e)//close也可能会抛异常
			{
				System.out.println("关闭文件错误");
			}
			try
			{
				out.close();
			}
			catch(IOException e)
			{
				System.out.println("关闭输出流错误");
			}
		}
		System.out.println("文件已复制");
	}
}

(1)本来是但是运行完程序之后自己出现了一个newHello.java文件,打开这个文件之后,,文字照样显示,可是用FileInputStream读取的时候,不是一个字节一个字节的读取吗?那样中文为什么还是能正常复制过来呢?因为,复制文件和输出不一样,输出文件的时候,要采用不同的编码格式,但是,复制文件的时候,和Ctrl+C,Ctrl+V相同,没有采用任何编码格式。

(2)这样,实现了从HelloWorld.java这个文件中一个字节一个字节的读,向newHello.java这个文件中一个字节一个字节的写。


5、实现mp3拷贝

实例4:TestFileStreamToCopyMp3

—执行速度比较慢,用BufferedInputStream比较快 

import java.io.*;

public class TestFileStreamToCopyMp3
{
	public static void main(String[] args) 
	{
		int b=0;
		FileInputStream in=null;//可能会抛出一个已检查异常//别忘记导入包
		FileOutputStream out=null;
		try
		{
			in=new FileInputStream("克罗地亚狂想曲.mp3");
			out=new FileOutputStream("mysong.mp3");
			while((b=in.read())!=-1)
			{
				out.write(b);//读完之后,写到newHello.java这个文件中去
			}
			in.close();
			out.close();
		}
		catch(FileNotFoundException e2)
		{
			System.out.println("找不到指定文件");
			System.exit(-1);//直接退出程序
		}
		catch(IOException e1)
		{
			System.out.println("文件复制错误");
		}
		System.out.println("文件已复制");
	}
}

已经写好一个文件了,但是,如果还想再通过输出流,在这个文件的末尾写一些东西的话,会将原来的内容给覆盖掉,如何才能在原来文件的末尾追加一些内容呢?


6、向文件输入

实例5:TestFileWriter

—问题:为什么很多都是乱码呢?

—注意:FileWrite和FileRead只能以系统默认的编码格式读写文件

import java.io.*;

/*
 * 功能:向文件unicode.dat中输出Unicode编码为0—50000的字符
 * */
public class TestFileWriter 
{
	public static void main(String[] args) 
	{
		FileWriter fw=null;//可能会抛出一个已检查异常//别忘记导入包
		try
		{
			fw=new FileWriter("E:\\workplace\\KeJian\\unicode.txt");//双斜杠是转移符的问题,\\代表\
			for(int c=0;c<=50000;c++)
				fw.write(c);
		}
		catch(IOException e)
		{
			e.printStackTrace();
			System.out.println("文件写入错误");
		}
		finally//是一个保护代码,里面的内容是必须要执行的
		{
			try
			{
				fw.close();//这里就体现了为什么要在try外面命名in,因为,这样就可以访问in,调用close方法,关闭掉流
			}
			catch(IOException e)//close也可能会抛异常
			{
				System.out.println("关闭文件失败");
			}
		}
		System.out.println("文件完成书写");
	}
}

(1)原本这里没有unicode.txt这个文件,但是运行完之后,在指定的路径之下,就产生了这个文件

(2)别忘记转义字符

猜你喜欢

转载自blog.csdn.net/fighting123678/article/details/84253496