本地文件的读写操作_Java|Python _CodingPark编程公园
发布日期:2021-06-29 15:46:13 浏览次数:2 分类:技术文章

本文共 10604 字,大约阅读时间需要 35 分钟。

Java本地文件的读写操作

文章介绍

本文系统性解决了:文件读入(根据路径)|文件写出(拼串儿)|文件读入并写出(根据路径)

知识点讲解

预备知识

一开始我十分不解我们为啥要说读操作和写操作呢?

读写的主体是谁呀?
经过学习各路大神的文章后我明白了:
我们把内存当作主体,你从硬盘往内存里Input 东西就是自然是内存主体读入数据咯,写出也是同理可得。

字节流和字符流

什么是流?

笔者认为 流是一个抽象的概念,可以想象为水管里的水
输入流可以看作一个输入通道(管道),输出流可以看作一个输出通道(管道)

什么是字节流?

字节流的类通常以stream结尾
字节流–传输过程中,传输数据的最基本单位是字节的流。
常用的字节输入流主要有:
InputStream
FileInputStream
BufferedInputStream
常用的字节输出流主要有:
OutputStream
FileOutputStream
BufferedOutputStream

什么是字符流?

字符流的类通常以reader和writer结尾
字符流–传输过程中,传输数据的最基本单位是字符的流。
常见的字符输入流有:
Reader
InputStreamReader
FileReader
BufferedReader
常见的字符输出流有:
Writer
OutputStreamWriter
FileWriter
BufferedWriter

字节数据是二进制形式的,要转成我们能识别的正常字符,需要选择正确的编码方式。我们生活中遇到的乱码问题就是字节数据没有选择正确的编码方式来显示成字符。

字符编码方式不同,有时候一个字符使用的字节数也不一样,比如ASCLL方式编码的字符,占一个字节;而UTF-8方式编码的字符,一个英文字符需要一个字节,一个中文需要三个字节。

从本质上来讲

写数据(即输出)的时候,字节也好,字符也好,本质上都是没有标识符的,需要去指定编码方式

读数据的时候,如果我们需要去“看数据”,那么字节流的数据需要指定字符编码方式,这样我们才能看到我们能识别的字符;而字符流,因为已经选择好了字符编码方式,通常不需要再改了(除非定义的字符编码方式与数据原有的编码方式不一致!)

在传输方面上,由于计算机的传输本质都是字节,而一个字符由多个字节组成,转成字节之前先要去查表转成字节,所以传输时有时候会使用缓冲区。

详细说明

File

代表目录或者文件
File 类本身并没有提供用于输入输出的方法,它只是代表了计算机中的文件或目录。


常用的字节输入流主要有:

InputStream
FileInputStream
BufferedInputStream

InputStream

介绍:
InputStream是老大
使用:
read(byte[] b):从流中读取b的长度个字节的数据存储到b中,返回结果是读取的字节个数(当再次读时,如果返回-1说明到了结尾,没有了数据)
read(byte[] b, int off, int len):从流中从off的位置开始读取len个字节的数据存储到b中,返回结果是实际读取到的字节个数(当再次读时,如果返回-1说明到了结尾,没有了数据)
close():关闭流,释放资源。
InputStream是抽象基类,所以它不可以创建对象,但它可以用来“接口化编程”,因为大部分子类的函数基类都有定义,所以利用基类来调用函数。


FileInputStream

介绍:
主要用来操作文件输入流
使用:
InputStream inputstream = new FileInputStream(“fileName”);
因为FileInputStream继承InputStream 类,所以可以这样用
FileInputStream是用来读文件数据的流,所以它需要一个文件对象用来实例化,这个文件可以是一个File对象,也可以是文件名路径字符串.【这里文件不存在会抛错】
在这里插入图片描述


BufferInputStream

介绍:
带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多!
使用:
BufferedInputStream是一种封装别的流以提高效率的流,所以它的初始化需要一个的InputStream流对象
在这里插入图片描述


常用的字节输出流主要有:

OutputStream
FileOutputStream
BufferedOutputStream

OutputStream

是字节输出流的基类
OutputStream是抽象基类,所以它不能实例化,但它可以用于接口化编程
write(byte[] b):将b的长度个字节数据写到输出流中。
write(byte[] b,int off,int len):从b的off位置开始,获取len个字节数据,写到输出流中。
flush():刷新输出流,把数据马上写到输出流中。
close():关闭流,释放系统资源。


FileOutputStream

是用于写文件的输出流,它除了可以使用基类定义的函数外,还实现了OutputStream的抽象函数write(int b):
write(int b):将b转成一个字节数据,写到输出流中。
在这里插入图片描述


BufferedOutputStream

像上面那个BufferedInputStream一样,都可以提高效率。它除了可以使用基类定义的函数外,它还实现了OutputStream的抽象函数write(int b):
write(int b):将b转成一个字节数据,写到输出流中。

在这里插入图片描述


常见的字符输入流有:

Reader
InputStreamReader
FileReader
BufferedReader

Reader

是字符输入流的抽象基类 ,它定义了以下几个函数:
Reader 是一个抽象基类,不能实例化
read() :读取单个字符,返回结果是一个int,需要转成char;到达流的末尾时,返回-1
read(char[] cbuf):读取cbuf的长度个字符到cbuf这种,返回结果是读取的字符数,到达流的末尾时,返回-1
close() :关闭流,释放占用的系统资源。


InputStreamReader

InputStreamReader 继承自抽象类 Reader
InputStreamReader 可以把InputStream中的字节数据流根据字符编码方式转成字符数据流。
InputStreamReader需要一个字节输入流对象作为实例化参数。还可以指定第二个参数,第二个参数是字符编码方式,可以是编码方式的字符串形式,也可以是一个字符集对象。
终于看到read()方法了
public int read() //读取单个字符的字符集编码,如果流被读完,返回-1
public int read(char cbuf[], int offset, int length) //读取部分字符到字符数组cbuf
在这里插入图片描述


FileReader

FileReader 继承自InputStreamReader
FileReader 需要一个文件对象作为实例化参数,可以是File类对象,也可以是文件的路径字符串。
FileReader 可以把FileInputStream中的字节数据转成根据字符编码方式转成字符数据流。
FileReader是用于读取字符文件,将文件以字符流的形式读出,但是仍然没有看到输入的方法,接下来看看它们的父类,看父类有没有我们要的方法。
在这里插入图片描述


BufferedReader(🌟常用)

FileReader 的read 方法是比较低效的
解决方案:用BufferedReader 包装FileReader
BufferReader需要一个字符输入流对象作为实例化参数。
readline是会自动换行的
在这里插入图片描述
在这里插入图片描述


常见的字符输出流有:

Writer
OutputStreamWriter
FileWriter
BufferedWriter

Writer

是字符输出流的抽象基类, ,它定义了以下几个函数
Writer 是一个抽象基类,不能实例化
write(char[] cbuf) :往输出流写入一个字符数组。
write(int c) :往输出流写入一个字符。
write(String str) :往输出流写入一串字符串。
write(String str, int off, int len) :往输出流写入字符串的一部分。
close() :关闭流,释放资源。 【这个还是抽象的,写出来是说明有这个关闭功能】
flush():刷新输出流,把数据马上写到输出流中。 【这个还是抽象的,写出来是说明有这个关闭功能】


OutputStreamWriter

可以使我们直接往流中写字符串数据,它里面会帮我们根据字符编码方式来把字符数据转成字节数据再写给输出流,它相当于一个中介\桥梁。
OutputStreamWriter 需要一个输入流对象作为实例化参数。
在这里插入图片描述


FileWriter

与OutputStreamWriter功能类似,我们可以直接往流中写字符串数据,FileWriter内部会根据字符编码方式来把字符数据转成字节数据再写给输出流。
FileWriter 需要一个文件对象来实例化,可以是File类对象,也可以是文件的路径字符串
在这里插入图片描述


BufferedWriter

比FileWriter还高级一点,它利用了缓冲区来提高写的效率。它还多出了一个函数:
newLine() :写入一个换行符。
在这里插入图片描述
在这里插入图片描述


项目实例

ReadFiles

import java.io.*;import java.util.ArrayList;/** * @Author: TEAM-AG * @Description: * @Date: Created in 21:18 2020-04-19 * @Modified By: */public class ReadFiles {
public static void main(String[] args) {
readFileByLines("philosophy.txt"); } public static void readFileByLines(String fileName) {
File file = new File(fileName); BufferedReader reader = null; try {
reader = new BufferedReader(new FileReader(file)); String tempString = null; int line = 1; // 一次读一行,读入null时文件结束 while ((tempString = reader.readLine()) != null) {
// readline是自动换行的 Thread.sleep(500); System.out.println(tempString); line++; // line++ 目的在于记录行数,而不是跳转下一行。 } reader.close(); } catch (Exception e) {
e.printStackTrace(); } finally {
if (reader != null) {
try {
reader.close(); } catch (IOException e1) {
e1.printStackTrace(); } } } }}

GenerateFile

import java.io.*;/** * @Author: TEAM-AG * @Description: * @Date: Created in 18:57 2020-04-19 * @Modified By: */public class GenerateFile {
public static void main(String[] args) {
String USER_DIR = System.getProperty("user.dir");//获取user.dir属性 System.out.println("USER_DIR -> "+USER_DIR); //200000 表示生成20万行 for (int i = 0; i <1; i++) {
AppendWriteFile("./快乐兄弟.txt", "AG \n" + "男 \n" + "1994 \n" + "110108 \n" + "汉族 \n" + "ag10304932 \n" + "1580 \n" + "\n" + "\n" + "----\n" + "\n" + "\n" + "xzh\n" + "男\n" + "1997\n" + "41052\n" + "汉族\n" + "1004120572\n" + "1523\n" + "\n" + "\n" + "----\n" + "\n" + "\n" + "suwei\n" + "男 \n" + "1996 \n" + "41010 \n" + "汉族 \n" + "756729 \n" + "13661\n"); } System.out.println("状态 -> 写入完成"); } /* * 生成文件 * @param file 文件路径+文件名称 * @param conent 要生成的文件内容 */ public static void AppendWriteFile(String file, String conent) {
// Log4jBean.logger.info("开始以追加的形式写文件到:["+file+"]"); BufferedWriter out = null; try {
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true))); out.write(conent); // Log4jBean.logger.info("写文件:["+file+"]完成"); } catch (Exception e) {
// Log4jBean.logger.error("写文件:["+file+"]异常,异常信息为:["+e.getMessage()+"]"); } finally {
// Log4jBean.logger.info("开始关闭输出流"); try {
out.close(); } catch (IOException e) {
// Log4jBean.logger.info("关闭输出流异常,异常信息为:["+e.getMessage()+"]"); } } }}

Read and Write

import java.io.*;/** * @Author: TEAM-AG * @Description: * @Date: Created in 21:48 2020-04-19 * @Modified By: */public class ReadandWrite {
public static StringBuffer Bufcontent = new StringBuffer(""); public static void main(String[] args) {
readFileByLines("philosophy.txt"); AppendWriteFile("./philosophyNEW.txt",Bufcontent); } public static void readFileByLines(String fileName) {
File file = new File(fileName); BufferedReader reader = null; try {
reader = new BufferedReader(new FileReader(file)); String tempString = null; int line = 1; // 一次读一行,读入null时文件结束 while ((tempString = reader.readLine()) != null) {
Thread.sleep(100); System.out.println(tempString); Bufcontent.append(tempString+'\n'); line++; }// System.out.println(Bufcontent); reader.close(); } catch (Exception e) {
e.printStackTrace(); } finally {
if (reader != null) {
try {
reader.close(); } catch (IOException e1) {
e1.printStackTrace(); } } } } public static void AppendWriteFile(String file, StringBuffer conent) {
// Log4jBean.logger.info("开始以追加的形式写文件到:["+file+"]"); BufferedWriter out = null; try {
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true))); out.write(String.valueOf(conent)); // Log4jBean.logger.info("写文件:["+file+"]完成"); } catch (Exception e) {
// Log4jBean.logger.error("写文件:["+file+"]异常,异常信息为:["+e.getMessage()+"]"); } finally {
// Log4jBean.logger.info("开始关闭输出流"); try {
out.close(); } catch (IOException e) {
// Log4jBean.logger.info("关闭输出流异常,异常信息为:["+e.getMessage()+"]"); } } }}

Python本地文件的读写操作

ReadFile

1、开启txt文件

file_handle=open('1.txt',mode='r')

#使用r模式打开文件,做读取文件操作

#打开文件的模式,默认就是r模式,如果只是读文件,可以不填写mode模式

2、读取文件内容

第一种读取方式:#2.1 read(int)函数,  读取文件内容。如果指定读取长度,会按照长度去读取,不指定默认读取所有数据# content=file_handle.read(20)# print(content)第二种读取方式:#2.2readline(int)函数   默认读取文件一行数据content=file_handle.readline(20)print(content)第三种读取方式:#2.3 readlines()   会把每一行的数据作为一个元素放在列表中返回,读取所有行的数据contents=file_handle.readlines()print(contents)

3、关闭文件

file_handle.close()

GenerateFile

1、开启txt文件

file_handle=open('cc.txt',mode='w')

上述函数参数有(1.文件名,mode模式)

mode模式有以下几种:

#w 只能操作写入 r 只能读取 a 向文件追加

#w+ 可读可写 r+可读可写 a+可读可追加
#wb+写入进制数据
#w模式打开文件,如果而文件中有数据,再次写入内容,会把原来的覆盖掉

2、向文件写入数据

第一种写入方式:# 2.1  write 写入#\n 换行符file_handle.write('hello word 你好 \n')第二种写入方式: # 2.2  writelines()函数 会将列表中的字符串写入文件中,但不会自动换行,如果需要换行,手动添加换行符#参数 必须是一个只存放字符串的列表file_handle.writelines(['hello\n','world\n','你好\n','杭州\n','成都\n'])

3、关闭文件

file_handle.close()

在这里插入图片描述

转载地址:https://codingpark.blog.csdn.net/article/details/105622259 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java那些必须知道的事儿_CodingPark编程公园
下一篇:从朴素贝叶斯到N-gram语言模型_CodingPark编程公园

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月04日 03时33分52秒