java输入流和输出流文件应该建在什么位置

java输入流和输出流文件应该建在什么位置,第1张

在Java程序中,要想从文件中读取数据,需要在程序和文件之间建立一条数据输入的通道,这样程序就可以从文件中读取数据了;反之,如果要在Java程序中把数据写入到文件中,也需要在程序和文举斗件之间建立一条数据输出的通道。当程序猜蔽创建输入流对象时,Java会自动建立这个数据输入通道,而创建输出流时,Java也会自动建立这个数据输出通道。如下图所示:

Java程序读取与写入数据

输入流是从文件读取数据,是一个拉取数据的过程;输出流是将数据写入到文件,是一个推送数据的过程。

为了便于理解输入输出流,前面都是以文件为数据源来讨论穗答州的。其实,Java的输入与输出流支持任何数据源的读取与写入,包括键盘、文件、网络、数据库等数据源。

输入流和输出流按读取和写入的数据单位可分为字节流和字符流,字节流是以字节为单位传输数据的流,字符流是以字符为单位传输数据的流。

Java所提供的输入流和输出流类封装在Java.io包中

//java中使用文件输入流和文件输出流进行文件读写的用例!           

Java 

   package com.test.io 

import java.io.File 

import java.io.FileInputStream 

import java.io.FileNotFoundException 

import java.io.FileOutputStream 

import java.io.IOException 

import java.io.InputStream 

import java.io.OutputStream 

/** 

 *  

 * @author 亚当爱上java 

 * 用例内容:文件输入流和文件输入流结合用例,字节流方式 

* 时间:2010-06-20 

 * 注意事项:文件输入流和绝亮文件输出流都是相对与内存来说的,例如通过程序读取文件时往内存输入数据就是文件输入流 

*/ 

public class FileInputOrOutput { 

 public static void main(String[] args) { 

  // 文件或者路径名的抽象表现形式,意思就是说之后如果进行 *** 作的话就是全部在这个抽象路径名所指向的文件或者文件加中 

  File file = new File("e:/test.txt") 

  File file2 = new File("e:/test1.txt") 

   

  // 文件字节数的个数 

  // System.out.println(file.length()) 

  try { 

   /*------------------------------------------读 *** 作部分-----------------------------------------------*/ 

   //文件输入流对象 

   InputStream fis = new FileInputStream(file) 

   // 文件输入流对象所读取的字节数大小 

   // System.out.println(fis.available()) 

   /** 

    * 1.按照一个字节为单位进行读取数据,弊端是遇到中文就会把中文的汉字拆开从而出现乱码 

    */ 

   // //流对象读出的返回值是每次所读到的一个字符所对应的ascii码值 

   // int i = fis.read() 

   //    

   // //如果已经读到文件尾则i==-1,此时终止循环 

   // while(i!=-1){ 

   // System.out.print((char)i) 

   // 保证每一次循环都继续往后读取一个字符,否则i的值不变会成为死循环 

   // i = fis.read() 

   // } 

   /** 

    * 2.按照一个字节数组并伏宽所指定的大小为单位进行读取,每次最多可以读取数组定义的大小的字节个数 

    */ 

   // 每次读取都以1K字节作为单位来进行 

   byte b[] = new byte[1024] 

   // 流对象读出并返回的是每次读取字节的个数,最大每次读取自己数可以和数组b.length相同 

   // b中存储了每次所读取的所有数据 

   int i = fis.read(b) 

   String str = "" 

   // 如果已经读到文件尾则i==-1,此时终止循环 

   while (i != -1) { 

    // 把每次读取的字节数组解码为字符串 

    // 参数1:要解码为字符的字节 

    // 参数2:厅亮要解码的首字符的索引 

    // 参数3:要解码的字节的个数,如果文件个数大于所设定的一次读取文件的大小时i的取值就是 

    // b.length,否则小于数组的字节大小时则为实际的读取出自己数的大小 

    str = str + new String(b, 0, i) 

    // 保证每一次都往文件的下一部分进行读取,否则i值没有变化会成为死循环 

    i = fis.read(b) 

   } 

   // System.out.print(str) 

   // 关闭输入流对象 

   fis.close() 

   

   /*------------------------------------------写 *** 作部分-----------------------------------------------*/ 

   //文件输出流对象 

   OutputStream fos = new FileOutputStream(file2) 

    

   //str是从file所指定的文件中读出的所有内容,将此内容写入另一个文件中 

   //将字符解码为字节数组 

   byte b2[] = str.getBytes() 

    

   //将解码后的字节数组,通过文件输出流对象写入到缓冲区中 

   fos.write(b) 

   //强制将缓冲区中的内容输出到文件中 

   fos.flush() 

   //关闭输出流对象 

   fos.close() 

    

  } catch (FileNotFoundException e) { 

   // TODO Auto-generated catch block 

   e.printStackTrace() 

  } catch (IOException e) { 

   // TODO Auto-generated catch block 

   e.printStackTrace() 

  } 

 } 

}

程序如下:\x0d\x0a \x0d\x0a\x0d\x0aFile file1 = new File("/home/a123/a")\x0d\x0a\x0d\x0aif (file1.exists()) { \x0d\x0aSystem.out.println("存在文件夹a") \x0d\x0a} else { \x0d\x0afile1.mkdir()// 文件夹的创建 创建文件夹/home/a123/a \x0d\x0a} \x0d\x0aFile file2 = new File("/home/a123/a/test") \x0d\x0aif (file2.exists()) { \x0d\x0aSystem.out.println("存在文件夹或者文件test") \x0d\x0a} else { \x0d\x0atry { \x0d\x0afile2.createNewFile()// 文件的创建,注意与文件夹创建的区别 \x0d\x0a} catch (IOException e) { \x0d\x0a// TODO Auto-generated catch block \x0d\x0ae.printStackTrace() \x0d\x0a} \x0d\x0a} \x0d\x0a \x0d\x0a/** \x0d\x0a * 最简单的文件读写方法是使用类FileWriter \x0d\x0a * (它的父类依次是java.io.OutputStreamWriter——>java.io.Writer——>java.lang.Object )\x0d\x0a */ \x0d\x0a \x0d\x0a// 下面是裤雀向文件file2里面写数据 \x0d\x0atry { \x0d\x0aFileWriter fileWriter = new FileWriter(file2) \x0d\x0aString s = new String("This is a test! \n" + "aaaa") \x0d\x0afileWriter.write(s) \x0d\x0afileWriter.close()// 关闭数手旁据流 \x0d\x0a\x0d\x0a} catch (IOException e) { \x0d\x0a// TODO Auto-generated catch block \x0d\x0ae.printStackTrace() \x0d\x0a} \x0d\x0a \x0d\x0a/* \x0d\x0a * 这样写数据的话,是完全更新文件test里面的内容,即把以前的东西全部删除,重新输入。 \x0d\x0a * 如果不想删除以前的数据,而是把新增加的内容增胡薯早添在文件末尾处。只需要在创建FileWriter对象时候,使用另外一个构造函数即可: \x0d\x0a * FileWriter fileWriter=new FileWriter(file2,true)\x0d\x0a */ \x0d\x0a \x0d\x0a// 下面是从文件file2读东西 \x0d\x0atry { \x0d\x0aFileReader fileReader = new FileReader(file2) \x0d\x0aString s = null \x0d\x0achar ch \x0d\x0atry { \x0d\x0achar[] c = new char[100] \x0d\x0afileReader.read(c,0,2)// 具体想得到文件里面的什么值(单个char?int?还是String?), \x0d\x0aSystem.out.println(c) \x0d\x0afileReader.close() \x0d\x0a \x0d\x0a} catch (IOException e) { \x0d\x0a// TODO Auto-generated catch block \x0d\x0ae.printStackTrace() \x0d\x0a} \x0d\x0a \x0d\x0a} catch (FileNotFoundException e) { \x0d\x0a// TODO Auto-generated catch block \x0d\x0ae.printStackTrace() \x0d\x0a} \x0d\x0a/** \x0d\x0a * 具体想得到文件里面的什么值(单个char?int?还是String?),需要知道不通read的不同用法: \x0d\x0a * 1. int read() 读取单个字符。 \x0d\x0a * 2. int read(char[] cbuf) 将字符读入数组。可以再将字符型数组转化位字符串 \x0d\x0a * 3. int read(char[] cbuf,int off,int len) 将字符读入数组的某一部分。 \x0d\x0a * 这三个方法都返回一个int值,作用是:读取的字符数,如果已到达流的末尾,则返回 -1. \x0d\x0a */ \x0d\x0a \x0d\x0a}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12154642.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存