首页 > 编程语言 >Java文件处理(二):文件读写

Java文件处理(二):文件读写

时间:2023-11-17 23:22:19浏览次数:27  
标签:文件 Java int 读写 写入 write new void

读/写文件前请保证文件存在。

InputStream

InputStream是基本的输入流,它是一个抽象类(不是接口)

最基本的方法是int read(),作用是读取输入流的下一个字节,并返回字节的int值,返回-1代表已读到结尾。

按字节读取一个文件流:

public void readFile() throws IOException{
    try(InputSteam ins=new FileInputStream("文件路径")){
        //FileInputStream是常见的InputStream实现类
        int n;
        while((n=ins.read())!=-1)
            System.out.println(n);
    }
    //finally{ins.close();}//关闭流,此处编译器已自动添加
}

这里用到了try(resource)写法,能让编译器自动关闭资源。

不这么写的话请务必加上close()

Reader

Reader是另一个输入流接口,但它以一个字节(char)为单位进行读取。Readerread()方法(不用try(resource)版本):

public void readFile() throws IOException {
    // 创建一个FileReader对象:
    Reader fr = new FileReader("文件路径"); 
    for (;;) {
        int n = reader.read(); 
        if (n == -1) {
            break;
        }
        System.out.println((char)n); 
    }
    reader.close(); // 关闭流
}

文本出现中文时可能有乱码问题,所以需要在创建FileReader时指定编码:

Reader reader = new FileReader("src/readme.txt", StandardCharsets.UTF_8);

Windows系统的默认编码可能是GBK,打开一个UTF-8编码的文本文件就会出现乱码。

如果需要按行读的话,可以利用Scanner

public static void printFile(String file){
        //保证文件存在!
        Scanner sc= null;
        try {
            FileReader fr=new FileReader(file);
            sc = new Scanner(fr);//给sc提供一个文件对象
            while(sc.hasNextLine()){
                String line=sc.nextLine();//注意下nextline()不会读取末尾的换行符
                System.out.println(line);
            }
            fr.close();//养成关闭文件流的好习惯
        } catch (IOException e) {//抛出异常
            System.out.println("File operation failed");
        }

}

文件写入

OutputStream

这是基本的输出流,和InputStream一样也是抽象类,它最基本的方法是void write(int b),会写一个字节到输出流。(注意只会写int的最低8位表示的字节)。

当然更常用的是它的重载方法void write(byte[]),一次写入多个字节:

public void writeFile() throws IOException {
    try (OutputStream output = new FileOutputStream("文件路径")) {
        output.write("Hello".getBytes("UTF-8"));
    } 
}

这里同样利用了try(resource)写法,让编译器自动关闭资源。

Writer

Reader对应,Writer以字符为单位进行输出。

Writer是所有字符输出流的超类,它提供的方法主要有:

  • 写入一个字符(0~65535):void write(int c)
  • 写入字符数组的所有字符:void write(char[] c)
  • 写入String表示的所有字符:void write(String s)

FileWriter类:属于Writer的子类。它的使用方法和FileReader类似:

try (Writer writer = new FileWriter("readme.txt", StandardCharsets.UTF_8)) {
    writer.write('H'); // 写入单个字符
    writer.write("Hello".toCharArray()); // 写入char[]
    writer.write("Hello"); // 写入String
}

构造FileWriter时可选择写入方式:

FileWriter fileWriter=new FileWriter(file,append);

其中appendboolean值,若为true则保留现有的内容,将新内容附加在该文件的末尾;为false则使用新内容替换现有内容。

默认情况下为appendfalse

BufferedWriter

BufferedWriterBufferedReader 为带有默认缓冲的字符输出输入流。

利用BufferedWriter进行写操作,写入的内容会放在缓冲区内,直到遇到close()flush()的时候才会将内容一次性写入文件。

构造方法:

FileWriter fileWriter=new FileWriter(file,append);
BufferedWriter bf = new BufferedWriter(fileWriter);

主要方法:

void write(char ch);//写入单个字符。
void write(char []cbuf,int off,int len)//写入字符数据的某一部分。
void write(String s,int off,int len)//写入字符串的某一部分。
void newLine()//写入一个行分隔符。
void flush();//刷新该流中的缓冲。将缓冲数据写到目的文件中去。
void close();//关闭此流,再关闭前会先刷新他。

实例代码:

 public static void writeFile(String fileName,String content,boolean append) throws IOException {
        File file =new File(fileName);
     	/*没有文件就创建文件*/
        File fileParent=file.getParentFile();
        if(!fileParent.exists()){
            fileParent.mkdirs();
        }
        if(!file.exists()){
            file.createNewFile();
        }
        FileWriter fileWriter=new FileWriter(file,append);//附加or重写
        BufferedWriter bw=new BufferedWriter(fileWriter);
        bw.write(content);
        bw.close();
 }

另外注意close()的顺序,一定要先关闭BufferedWriter,再关闭Writer

标签:文件,Java,int,读写,写入,write,new,void
From: https://www.cnblogs.com/qiuerOTO/p/17839889.html

相关文章

  • 1.Java8新特性
    1.Lambda表达式 1.1概述Lambda表达式是一种函数式编程(函数编程思想)方式,用于替代匿名内部类。它使得代码更具有可读性和简洁性,并提供更好的代码复用性和可维护性。面向对象编程思想:强调的是对象,必须通过对象来完成操作,情况较复杂。例如:多线程执行任务,需要创建对象。......
  • Java集合类API详解​(上)单列集合Set类
    Java集合类API详解单列集合一次添加一个数据的集合。它们的根接口是Collection,具体体系如图:List系列集合的特点:添加的元素是有序、可重复、有索引的。也即存和取的顺序是一致的;包含的元素是可以有重复的;包含的元素是有索引的,可以通过索引对元素进行操作。Set系列集合的特点:添加的元......
  • Java集合类API详解​(下)双列集合Map类
    Java集合类API详解双列集合双列集合的概念,也即一次添加一对数据的集合。双列集合的特点:①双列集合一次需要存一对数据,分别为键和值②键不能重复,值可以重复③键和值是一一对应的,每一个键只能找到自己对应的值④键+值这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“E......
  • Java常见八大异常(新手必看)
    ......
  • 11.17 复习JavaScript红宝书的笔记——
    一、原始值与引用值对于原始值和引用值的判断类型各自有对应的操作符,前者可以用typeof操作符lets="Nicholas";letb=true;leti=22;letu;letn=null;leto=newObject();console.log(typeofs);//stringconsole.log(typeofi);//numberconsole......
  • Java捕获异常(入门级)
    ⭐一、什么是异常异常就是程序运行时,出现代码报错或者终止代码运行,它阻止了程序正常执行,这就是异常。在Java编译或运行或者运行过程中出现的错误。Java提供了更加优秀的解决办法:异常处理机制。⭐二、捕获异常Java异常机制关键字有:try、catch、finally、throw、throws。t......
  • java 多态
    packagenet.elaina.polymorphismdemo02;publicclassTest{publicstaticvoidmain(String[]args){//创建对象(多态方式)//Fuf=newzi();Animala1=newDog();//调用成员变量:编译看左边,运行也看左边//编译看......
  • linux各目录存放文件类型
    /usr最庞大的目录,要用到的应用程序和文件几乎都在这个目录。其中包含:/usr/X11R6存放Xwindow的目录/usr/bin众多的应用程序/usr/sbin超级用户的一些管理程序/usr/doclinux文档/usr/includelinux下开发和编译应用程序所需要的头文件/usr/lib常用的动态链接库和软件包的配置......
  • CVE-2023-4357 Chrome任意文件读取 [漏洞复现]
    CVE-2023-4357Chrome任意文件读取--->漏洞描述由于未充分验证XML中不受信任的输入,远程攻击者可利用该漏洞通过构建的HTML页面绕过文件访问限制,导致chrome任意文件读取。漏洞复现--->影响版本GoogleChrome<116.0.5845.96proxychainswgethttps://edgedl.me.gvt1.......
  • 在Rider 中使用Entity Framework Core UI 插件创建EFCore 的 Migration迁移文件时报错
    报错信息EFCoretoolsarerequiredtoexecutethisaction在点击报错信息中的发Fix进行安装时,再次出错这次是提示版本不匹配这里我使用的是EFCore7.0.14版本的报错原因没有安装dotnettool点击Fix进行安装时,是安装的最新版,是要是.net7的安装dotnettool直......