文件拷贝 上传下载 输入流输出流个人小结,仅供自己使用

fileinputstream文件输入流  inputstream输入流中的read()方法读取文件是一个字节一个字节读取的,读取出来的中文会乱码  因为一个汉字占一个字符即是两字节

 使用filereader流来读取  中英文都可以显示 因为 reader流中的read方法是一个一个字符进行读取的  这样读取的汉字就是完整的  不会乱码

fileinputstream in = new fileinputstream(文件路径)

 

 package cn.galc.test;
 2 
 3 import java.io.*;
 4 
 5 public class TestFileInputStream {
 6     public static void main(String args[]) {
 7         int b = 0;// 使用变量b来装调用read()方法时返回的整数
 8         FileInputStream in = null;
 9         // 使用FileInputStream流来读取有中文的内容时,读出来的是乱码,因为使用InputStream流里面的read()方法读取内容时是一个字节一个字节地读取的,而一个汉字是占用两个字节的,所以读取出来的汉字无法正确显示。
10         // FileReader in = null;//使用FileReader流来读取内容时,中英文都可以正确显示,因为Reader流里面的read()方法是一个字符一个字符地读取的,这样每次读取出来的都是一个完整的汉字,这样就可以正确显示了。
11         try {
12             in = new FileInputStream("D:\\Java\\MyEclipse 10\\Workspaces\\AnnotationTest\\src\\cn\\galc\\test\\FileInputStream.java");
13             // in = new FileReader("D:/java/io/TestFileInputStream.java");
14         } catch (FileNotFoundException e) {
15             System.out.println("系统找不到指定文件!");
16             System.exit(-1);// 系统非正常退出
17         }
18         long num = 0;// 使用变量num来记录读取到的字符数
19         try {// 调用read()方法时会抛异常,所以需要捕获异常
20             while ((b = in.read()) != -1) {
21                 // 调用int read() throws Exception方法时,返回的是一个int类型的整数
22                 // 循环结束的条件就是返回一个值-1,表示此时已经读取到文件的末尾了。
23                 // System.out.print(b+"\t");//如果没有使用“(char)b”进行转换,那么直接打印出来的b就是数字,而不是英文和中文了
24                 System.out.print((char) b);
25                 // “char(b)”把使用数字表示的汉字和英文字母转换成字符输入
26                 num++;
27             }
28             in.close();// 关闭输入流
29             System.out.println();
30             System.out.println("总共读取了" + num + "个字节的文件");
31         } catch (IOException e1) {
32             System.out.println("文件读取错误!");
33         }
34     }
35 }





fileoutputstream
 package cn.galc.test;
 2 
 3 import java.io.*;
 4 
 5 public class TestFileOutputStream {
 6     public static void main(String args[]) {
 7         int b = 0;
 8         FileInputStream in = null;
 9         FileOutputStream out = null;
10         try {
11             in = new FileInputStream("D:\\Java\\MyEclipse 10\\Workspaces\\AnnotationTest\\src\\cn\\galc\\test\\MyMouseAdapter.java");
12             out = new FileOutputStream("D:/java/TestFileOutputStream1.java");
13             // 指明要写入数据的文件,如果指定的路径中不存在TestFileOutputStream1.java这样的文件,则系统会自动创建一个
14             while ((b = in.read()) != -1) {
15                 out.write(b);
16                 // 调用write(int c)方法把读取到的字符全部写入到指定文件中去
17             }
18             in.close();
19             out.close();
20         } catch (FileNotFoundException e) {
21             System.out.println("文件读取失败");
22             System.exit(-1);// 非正常退出
23         } catch (IOException e1) {
24             System.out.println("文件复制失败!");
25             System.exit(-1);
26         }
27         System.out
28                 .println("TestFileInputStream.java文件里面的内容已经成功复制到文件TestFileOutStream1.java里面");
29     }
30 }
注意:FileInputStream和FileOutputStream这两个流都是字节流,都是以一个字节为单位进行输入和输出的。所以对于占用2个字节存储空间的字符来说读取出来时就会显示成乱码。


package cn.galc.test;
 2 
 3 /*使用FileWriter(字符流)向指定文件中写入数据
 4 写入数据时以1个字符为单位进行写入*/
 5 import java.io.*;
 6 public class TestFileWriter{
 7     public static void main(String args[]){
 8         /*使用FileWriter输出流从程序把数据写入到Uicode.dat文件中
 9         使用FileWriter流向文件写入数据时是一个字符一个字符写入的*/
10         FileWriter fw = null;
11         try{
12                 fw = new FileWriter("D:/java/Uicode.dat");
13                 //字符的本质是一个无符号的16位整数
14                 //字符在计算机内部占用2个字节
15                 //这里使用for循环把0~60000里面的所有整数都输出
16                 //这里相当于是把全世界各个国家的文字都0~60000内的整数的形式来表示
17                 for(int c=0;c<=60000;c++){
18                     fw.write(c);
19                     //使用write(int c)把0~60000内的整数写入到指定文件内
20                     //调用write()方法时,我认为在执行的过程中应该使用了“(char)c”进行强制转换,即把整数转换成字符来显示
21                     //因为打开写入数据的文件可以看到,里面显示的数据并不是0~60000内的整数,而是不同国家的文字的表示方式
22             }
23             /*使用FileReader(字符流)读取指定文件里面的内容
24             读取内容时是以一个字符为单位进行读取的*/
25                 int b = 0;
26                 long num = 0;
27                 FileReader fr = null;
28                 fr = new FileReader("D:/java/Uicode.dat");
29                 while((b = fr.read())!= -1){
30                     System.out.print((char)b + "\t");
31                     num++;
32                 }
33                 System.out.println();
34                 System.out.println("总共读取了"+num+"个字符");
35         }catch(Exception e){
36             e.printStackTrace();
37         }
38     }
39 }



FileReader和FileWriter这两个流都是字符流,都是以一个字符为单位进行输入和输出的。
所以读取和写入占用2个字节的字符时都可以正常地显示出来,
以上是以File(文件)这个类型为例对节点流进行了讲解,所谓的节点流指定就是直接把输入流或输出插入到数据源上,
直接往数据源里面写入数据或读取数据。




转载于:https://www.cnblogs.com/cpx123/p/7652958.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值