Java文件操作/IO

Eclipse中Java IO文件操作全解析 资源过滤资源过滤器可以隐藏不需要显示的文件或文件夹。比如在进行调试时,可以过滤掉不必要的日志文件或编译生成的.class文件。自定义文件视图Eclipse提供了强大的文件视图自定义功能。开发者可以创建和配置自定义视图来优化开发工作流,例如,可以设置专门的视图来快速查看特定的文件集或过滤出特定类型的文件。graph TDA[工作空间] -->|包含| B[项目]B -->|包含| C[文件夹]C -->|包含| D[文件]A -.->|配置| E[过滤器设置] 阅读详情

一.什么是文件?

文件是一种在硬盘上存储数据的方式,操作系统帮我们把硬盘的一些细节都封装起来了,程序员只需要了解文件相关的接口即可,相当于操作文件就是间接的操作硬盘了,
硬盘用来存储数据,和内存相比硬盘的存储空间更大,访问速度更慢,成本更低,持久化存储,操作系统通过“文件系统”这样的模块来管理硬盘

别看我电脑上有c盘d盘,但是我电脑只装载着一块硬盘,操作系统可以通过文件系统把这个硬盘抽形成多个硬盘就如我的CD两盘,NTFS是windows上的文件系统,背后有一定的格式来组织硬盘的数据,EXT4是Linux上的文件系统

不同的文件系统管理文件的方式都是类似的
通过目录(directory,平常叫文件夹,专业术语叫目录)构成了N叉树的树形结构
我们在文件系统中都是通过路径来确定一个具体的文件

 

同样是一个cat.jpg文件,站在不同的基准目录上,查找的路径是不相同的

文件系统上存储的文件,具体来说又分成两大类


1.文本文件–存储的是字符
字符怎么定义呢?
有个表叫utf8,这个表上数据的组合就是字符
2.二进制文件–存储的是二进制数据
判断文本文件和二进制文件最简单的方式就是
直接用记事本打开,如果打开之后能看懂,就是文本,否则就是二进制像word文档,ppt,excel这些,如果托到记事本上,都是二进制文件,虽然word文档里存的东西是汉字等可以看懂的内容,但是word文档不仅仅包含我们自己输入的内容,还有行间距,文字格式等众多内容
但是如果把excel的后缀改成csv格式,就是文本文件了

utf8是文件的编码格式,此时一个汉字是三个字节的大小,在java中采用的编码格式是unicode,一个汉字是两字节的大小正好能放进char类型,那么java操作文件的时候不做处理肯定会出现问题,但是JVM已经处理好了

二.Java标准库中的操作文件类

操作文件可以理解成通过java代码把你硬盘的文件删除修改创建等,也就是通过java代码操作文件系统


Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意, File 对象可以对应到一个真实存在的文件,也可以对应到一个不存在的文件

 所有外部设备(包括硬盘)向系统传输数据的过程,对CPU 而言都属于"输入操作"。

File类里面的方法 

 获得文件路径

import java.io.File;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException {
        //File file = new File ("D:\\JavaEE\\java-ee-beginner\\test.txt");//绝对路径
        File file = new File("./test.txt");//相对路径,相对于当前项目目录

        System.out.println(file.getParent());//获得父目录
        System.out.println(file.getName());//获得文件名
        System.out.println(file.getPath());//获得文件路径(与上述构造方法路径相同)
        System.out.println(file.getAbsolutePath());//获得绝对路径
        System.out.println(file.getCanonicalPath());//获得规范路径(去除..等)

    }
}

创建文件和判断文件 

import java.io.File;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException {
        File file = new File("D:\\JavaEE\\java-ee-beginner\\test.txt");

        file.createNewFile();// 创建文件

        System.out.println(file.exists());// 判断文件是否存在
        System.out.println(file.isFile());// 判断是否是文件
        System.out.println(file.isDirectory());// 判断是否是目录
    }
}

 文件跟目录的区别可以认为是文件是这个路径的终点,而目录下面还有别的路径

删除文件

import java.io.File;

public class Demo {

public static void main(String[] args) {
        File file=new File("./test.txt");
        file.delete();
    }
}
import java.io.File;

public class Demo {

public static void main(String[] args) throws InterruptedException {
        File file=new File("./test.txt");
        //不是立刻删除,等到程序运行结束再删除
        file.deleteOnExit();
        Thread.sleep(2000);
        //程序运行两秒会结束,所以这个文件在两秒之后删除
    }
}

创建目录

public static void main(String[] args) {
        File file1 = new File("./testDir");

        File file2 = new File("./testDir/111/222");

        // mk => make    dir => directory
        // mkdir 一次只能创建一层目录.  mkdirs 可以一次创建多级目录
        file1.mkdir();

        //file2.mkdirs();//创建多级目录
    }

 列出目录内容

mport java.io.File;
import java.util.Arrays;

public class Demo4 {
    public static void main(String[] args) {
        //File file = new File("./test.txt");

        /*//文件是无法进行list(列出当前目录下的文件)
        String[] list = file.list();
        System.out.println(Arrays.toString(list));*/

        File file = new File("D:\\JavaEE\\java-ee-beginner");

        String[] list = file.list();//列出当前目录下的文件
        System.out.println(Arrays.toString(list));

        File[] files = file.listFiles();//列出当前目录下的文件(前缀带路径) 用File来接受
        System.out.println(Arrays.toString(files));
    }
}

文件重命名

import java.io.File;

public class Demo {
    public static void main(String[] args) {
        File file = new File("./test.txt");
        File file2 = new File("./test2.txt");

        boolean result = file.renameTo(file2);//把file重命名为file2
       
    }
}
mport java.io.File;

public class Demo {
    public static void main(String[] args) {
        /*File file = new File("./test.txt");
        File file2 = new File("./test2.txt");

        boolean result = file.renameTo(file2);//把file重命名为file2*/

        File file = new File("./test2.txt");
        File nweFile = new File("D:\\JavaEE\\java-ee-beginner\\20250607-File\\test2.txt");

        boolean result = file.renameTo(nweFile);//重命名操作还能起到移动文件的作用
        /**
         * 从操作系统的角度来看,重命名操做和移动操作(剪切)本质是一致的 移动操作极快,时间复杂度o1 (如果跨硬盘了就很慢了(复制+删除))
         * 复制文件,时间复杂度o(n),文件/目录里所有的数据,遍历,再写入写的文件/目录
         */
        System.out.println(result);
    }
}

对文件内容操作

 

 

 Reader类

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

// Reader 使用.
public class Demo
{
    public static void main(String[] args) throws IOException
    {
        // FileReader 构造方法, 可以填写一个文件路径(绝对路径/相对路径都行), 也可以填写一个构造好的 File 对象
//        Reader reader = new FileReader("。/test.txt");
//        try {
//            // 中间的代码无论出现啥情况, close 都能保证执行到.
//        } finally {
//            // 抛出异常, 或者 return, close 就都执行不到了~~
//            reader.close();
//        }

        // 上述使用 finally 的方式能解决问题, 但是不优雅.
        // 使用 try with resources 是更好的解决方案.

        try (Reader reader = new FileReader("d:/test.txt"))
        {
              while (true) {//一直
               /* int c = reader.read();//返回值int(最大值0xFFFF两个字节的最大值)
                if (c == -1) {
                    break;
                }
                System.out.println((char) c);*/

                char[] buf = new char[1024];//可以起到一个缓冲区的作用
                int n = reader.read(buf);
                if (n == -1) {
                    break;
                }

                for (int i = 0; i < n; i++) {
                    System.out.println(buf[i]);
            }
        }
    }
}

 

 

 InputStream类

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class Demo {
    public static void main(String[] args) throws IOException {
       
        try (InputStream inputStream = new FileInputStream("./test.txt")) {//出了try块,资源会自动释放,相当于自动调用inputStream.close()

            //读文件操作
            while (true) {
                /*int date = inputStream.read();//不带参数表示读取一个字节
                if (date == -1) {
                    //读完文件
                    break;
                }
                System.out.printf("0x%x\n", date);*/

                //一次读取多个字节,数组长度进行自定义
                byte[] bytes = new byte[3];
                //读操作,就会尽可能把字节数组给填满
                //填不满的话,能填几个就是几个
                int len = inputStream.read(bytes);
                System.out.println("len= " + len);
                //len就是表示实际读取了几个字节
                if (len == -1) {
                    //读完文件
                    break;
                }

                for (int i = 0; i < len; i++) {
                    System.out.printf("0x%x \n", bytes[i]);//打印每个字节的十六进制数
                }

                System.out.println("===========");
            }

        }
    }
}

于是我们可以借助Scanner来完成上述操作
平时我们输入是
Scanner scanner=new Scanner(System.in);

那么system.in的类型也是一个InputStream

 所以就有以下操作

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

public class Demo {
    public static void main(String[] args) throws IOException 
    {
        try (InputStream inputStream = new FileInputStream("./test.txt")) 
        {
            Scanner scanner = new Scanner(inputStream);
            // 此时就是从 test.txt 这个文件中读取数据了!!
            String s = scanner.next();
            System.out.println(s);
        }
    }
}

Scanner只是用来读取文本文件,不适合读取二进制文件,标准库中需要用到一些其他类

Write类

mport java.io.*;


public class Demo {
    public static void main(String[] args) {
        try (Writer writer = new FileWriter("./output.txt", true)) {//true是实现第二次输入的时候能够拼接第一次的输入
            //writer.write("666");

            BufferedWriter bufferedWriter = new BufferedWriter(writer);//带缓冲区的流
            bufferedWriter.write("777");//将内容写到缓冲区去里
            bufferedWriter.flush();//将缓冲区里的内容写入文件
            bufferedWriter.close();//可以放到try块里 自动关闭流


        } catch (IOException e) {
            e.printStackTrace();
        }
      

    }
}


         * 缓冲区通常是一段内存的运行空间 提高编程效率 减少磁盘IO操作 但是在一些特殊情况下 如网络传输 数据库操作等 就需要使用非缓冲区的流 如FileWriter(false)
         * 因此进行IO的时候就希望能使用缓冲区把要写的数据先放到缓冲区里 攒一波再一起写
         * 或者读取的时候也不是一个一个的读 而是一次读取一批数据 放到缓冲区再慢慢解析
         * 当前IO流 read和write就是属于直接读取文件了 想要提升效率
         * 1.手动创建缓冲区 byte[]手动减少read和write的次数
         * 2.就需要使用缓冲区流 如BufferedInputStream和BufferedOutputStream
         

 OutputStream和Write使用方式完全一样,但是Write不支持字符串参数,只能按照字节或字节数组进行输出写入

Win10和Ubantu16.04双系统下,卸载Ubantu Win10和Ubantu16.04双系统下,卸载Ubantu 机器配置 华硕主板,英伟达显卡(这不是重点) Win10与Ubantu16.04均为UFFI分区(如果不知道这个也不需要在意,一般默认的都是这样,鸵鸟原则) 清除Ubantu系统 一般按照常规的方法来删除Ubantu,都是直接将磁盘管理器里面的关于Ubantu的磁盘清空,但是还会留下一个UFFI分区,如果不进行删除的话,开机时候还是会有... 阅读详情

相关推荐

别再死记硬背菜单了!用Workbench搞定你的第一个ANSYS结构分析(附模型文件)

本文为零基础用户提供使用ANSYS Workbench完成第一个结构分析的完整指南。通过悬臂梁案例详细讲解从几何导入、材料定义、网格划分到边界条件设置的全流程,帮助初学者快速掌握有限元分析的基本操作,并附赠实用模型文件。

weixin_34233974的博客 307

io 文件操作java_Java I/O技术之文件操作详解

在java程序设计中,I/O操作是通过java.io包中的类和接口来实现的,因此,我们第一步要做的就是import这个包。java.io提供了一个File类,这是类很容易让人产生误会,它表示的是一个文件名或者目录名,而不是文件本身,所以通过这个类没法对文件里面的数据进行操作。File类提供了一序列对文件操作的功能:删除文件,创建目录,查询文件大小等等。要想对文件数据进行操作那就需要流对象了,在这里...

weixin_39704246的博客 130

从虚拟机到双系统:手把手教你为Gromacs搭建最强Linux环境(含WSL2、Ubuntu22.04配置)

本文详细指导如何在Windows系统下为Gromacs分子动力学模拟搭建高性能Linux环境,涵盖WSL2和Ubuntu22.04双系统配置。通过对比虚拟机、WSL2和原生Linux的性能数据,提供GPU加速、内存优化等实用技巧,帮助科研人员提升计算效率。

weixin_30861797的博客 269

JAVA文件操作--file/IO流

JAVA文件操作–File/IO流 文章目录JAVA文件操作--File/IO流一、File类File 类的字段File 类的构造方法File 类的常用方法递归二、IO流1.IO流的分类(组织架构)2.符字节,输入输出流的概念1.字符流和字节流2. 输入流和输出流 一、File类 Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。 File 类:文件和目录路径名的抽象表示。 注意:File 类只能操作文件的属性,文件的内容是不能操作的。 以pathn

Ronin__L的博客 378

【实用工具】QQ自动发消息

程序下载:蓝奏云 源代码: #include<Windows.h> #include<bits/stdc++.h> #include<conio.h> using namespace std; void HideWindow() { HWND hwnd; hwnd=FindWindow("ConsoleWindowClass",NULL); if(hwnd) ShowWindow(hwnd,SW_HIDE); return; } int main() { pri

liuzich的博客 2643

[ADS]单端电感和差分电感的感值和Q值计算公式

单端电感和差分电感的感值和Q值计算公式

乾巽的博客 1万+

Java文件操作和文件读写(数据流/IO流)

《Java文件操作与I/O流详解》摘要 本文系统介绍了Java文件操作的核心知识:1.文件基本概念:文件是存储设备上的数据集合,分为文本/二进制文件,通过文件系统以树形结构管理;2.Java文件操作:使用File类实现文件创建、删除、重命名等操作,详解路径表示和常用方法;3.I/O流体系:重点讲解字节流(FileInputStream/OutputStream)和字符流(Reader/Writer)的读写操作,包括缓冲流性能优化;4.对象序列化:通过ObjectInputStream/ObjectOutpu

m0_61359105的博客 1059

机器学习-深嵌交叉验证(Nested Cross-Validation)

Section I: Code and Analyses 第一部分:代码 from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from...

Santorinisu Blogs 2715

Java IO编程——文件操作类/字节流/字符流

Java IO 操作主要指的是通过Java进行输入、输出操作,Java中所有操作类都存放在 java.io 包中,用户在使用时需要将操作导入此包。 所有的 IO 操作都在 java.io 包中进行定义,而且整个 java.io 包实际上就是五个类和一个接口。 |- 五个类:File、InputStream、OutputStream、Reader、Writer; |- 一个接口:Serializa...

Happy_bugYJ的博客 328

CPU、Core、RISC、ARM等的前世今生

CPU、Core、RISC-V 、ARM、ASIC、FPGA、SOC概念及区分

nxin168的博客 1014

LLM评测框架Ragas:测试RAG的性能出现TimeoutError()的解决办法(Ragas+langchain+ollama)

无奈之下,自己找到了一个解决办法,在ragas支持的llm类库中加了一个如下的类,支持ollama、langchian_ollama使用ragas测试报错的问题。可以将如上的库放到你的ragas的系统库的llms目录下,然后修改__init__.py如下。最近用ragas测试rag的性能,发现老出现TimeoutError()的错误。这是一个临时的解决办法,具体等待官方给出最终的解决方案。后来发现官方也没有尽快支持的计划。然后就可以用如下代码进行一些验证。

Criss@陈磊 665

java.io常见流/java.io.file文件操作大全

http://wosyingjun.iteye.com/blog/1885786 今天学习了下java的IO流,这里做个总结,方便查找。   InputStream/OutputSrteam InputStream是个抽象类,表示字节输入流的所有类的超类。常见的有向文件写入数据。 OutputStream是个抽象类,表示字节输出流的所有类的超类。常见的有从文件写出数据。 继承关系:

zzy7075的专栏 3896

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java笔记035-IO流/文件、常用的文件操作、IO流原理及流的分类、IO流体系图-常用的类

Java笔记035-IO流/文件、常用的文件操作、IO流原理及流的分类、IO流体系图-常用的类

qq_59621600的博客 362

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【原创】JAVA基础(IO流/NIO类)之文件操作Demo

云霄: 仅为学习Java的基础IO流学习实例 代码示例 import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Scanner; public class IODemo { Scanner sc = new Scanner(System.in); public static void main(Strin

RubyXun's-Blog 205

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【Java 基础编程】Java IO 流与文件操作:字节流/字符流/缓冲流/对象流,读写文件一篇够用

本文介绍了Java IO流的基本概念和使用方法。IO流是Java处理文件输入输出的核心机制,分为输入/输出流、字节/字符流、节点/处理流等类型。File类提供了文件和目录的抽象表示,支持创建、删除、查询等操作。文章详细讲解了三种创建文件的方式,以及获取文件信息、目录操作和文件删除的常用方法。通过代码示例展示了如何创建文件、获取文件属性、操作目录等实用技巧,为Java文件操作提供了基础指导。掌握这些内容能够实现基本的文件读写功能,是Java开发必备技能。

懿轩的技术小窝 753

文件操作IO

如何在文件系统中如何定位我们的一个唯一的文件就成为当前要解决的问题,但这难不倒计算机科学家,因为从树型结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达的结点的路径所描述,而这种描述方式就被称为文件的绝对路径(absolute path)。这里的close非常重要,是用来释放不必要的资源的,这是因为,让一个进程打开一个文件,是需要从系统中申请一定的资源的(占用进程的pcb里的文件描述符表中的资源,这里的表是一个顺序表,长度有限,不会自动扩容)注意,有 File 对象,并不代表真实存在该文件。

qq_65291053的博客 1022

Java I/O 深度解析:java.io 包的全面指南

java.io包提供了全面且灵活的工具集,帮助开发者轻松地完成各种 I/O 操作。理解这些基础类的工作原理以及它们之间的关系对于编写高效、可靠的 Java 程序至关重要。希望上述介绍能够为你提供足够的信息来掌握 Java 的 I/O 功能。

LiuYuHao_的博客 894

io 2.0 IO流介绍

Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”(stream),通过流的方式允许Java程序使用相同的方式来访问不同的输入/输出源。 stream是从起源(source)到接收(sink)的有序数据。 Java把所有传统的流类型(类或抽象类)都放在java.io包中,用以实现输入/输出功能。 提示: 因为Java提供了这种IO流的抽象,所以开发者可以使用一致的IO代码去读写不同的IO流节点。 ..

大风起兮 181

Java IO推荐用法

From http://commons.apache.org/io/bestpractices.html: 1) 推荐使用java.io.File Often, you have to deal with files and filenames. There are many things that can go wrong: A class works in Unix but do

hitustc的专栏 590

Java IO读写文件总结——文件随机读写,顺序读写!

顺序IO和随机IO 对于磁盘的读写分为两种模式,顺序IO和随机IO。 随机IO存在一个寻址的过程,所以效率比较低。而顺序IO,相当于有一个物理索引,在读取的时候不需要寻找地址,效率很高。 网上盗了一个图(侵权删) Java中的随机读写 在Java中读写文件的方式有很多种,先总结以下3种方法: FileWriter和FileReader public static void fileWrite(String filePath, String content) { .

zhangkaixuan456的博客 6630

Java IO (上)

[b]一、概述[/b] IO即Input/Output,指输入/输出,IO设备是计算机系统的重要组成部分。Java使用"流"的方式处理IO,对象或者数据要进行传递,需要将对象或者数据转换成某种形式的流,然后通过流的形式传递到目的地,最后再将目的地的流转换成对象或者数据。例如通过网络传递数据,或者将内存中的数据持久化到文件或者数据库中都会涉及到IO操作,另外Java中的RMI和EJB等技术也会默认...

笑傲江湖 193

Java IO入门

我最近写了一篇关于Java IO的技术博客,介绍了Java程序中常用的IO操作和技术。我详细解释了Java IO的基本概念,例如输入流和输出流,以及如何使用它们来读取和写入文件、处理网络通信等。我还提供了一些常见的IO操作示例,帮助读者更好地理解和应用这些概念和技术。如果你对Java IO感兴趣,可以点击这里查看我的博客

weixin_42563619的博客 268

java-IO流

一、相关IO类的关系(图解) 文本I/O例如字符串"asd" 字符串——多个字符构成——每个字符经过编码—— 二进制I/O例如Btye 199 内存中的确切值保存到文件 199——11000111——写入 二、相关IO类的详解 1FileInputStream(文件流) 向文件读取/写入字节 2DataInputs...

bangshiyan4213的博客 124

IO小结

<br /><br />1.File<br />File类有一个欺骗性的名字——通常会认为它对付的是一个文件,但实情并非如此。它既代表一个特定文件的名字,也代表目录内一系列文件的名字。<br /> <br />FilenameFilter接口:过滤不需要的内容<br /> <br />2.输入和输出<br />“流”屏蔽了实际I/O设备中处理数据的细节。<br />输入、输出流中read(),wirte()方法,通常我们不会用到,因为有别的类能提供更有用的接口。<br /> <br />流的选择:<br /

DryKillLogic的专栏 737

Java IO相关技术小结

Java IO技术分为传统BIO(同步阻塞)、NIO(同步非阻塞)和AIO(异步非阻塞)三大类。BIO基于流操作,适合简单文件或网络通信;NIO引入通道、缓冲区和选择器,支持高并发处理;AIO由操作系统完成IO操作后通知应用。BIO线程开销大,NIO适合短连接高并发场景,AIO适合长连接任务。关键点包括:字节流与字符流的区别、NIO的零拷贝机制、Selector多路复用,以及异步回调模式。注意使用try-with-resources管理资源,结合场景选择合适IO模型。

William Chen's knowledge base 1019

Java IO操作详解

在Java编程中,IO(输入输出)是重要的组成部分,Java应用常常需要从外界输入数据或者把数据输出到外界。 Java IO的核心用一句话概括:抽象类或接口之中的抽象方法会根据实例化子类的不同,会完成不同的功能。所有的IO操作都在java.io包之中进行定义,而且整个java.io包实际上就是五个类和一个接口: (1)五个类:File、InputStream、OutputStream、Reader、Wirter; (2)一个接口:Serializable。 一、文件操作类File 在整个java.io包之中

muranfei的博客 1211
上一篇: 多线程--CAS原子操作
下一篇: 网络编程--TCP/UDP Socket套接字
刘 大 望
博客等级 码龄2年 896粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值