Java文件输入输出(IO流)操作方法
程序员文章站
2022-03-13 17:08:59
...
Java文件输入输出(IO流)操作方法
先说说我自己的看法吧:
字节流是负责文件数据传输的
字符流则是用于文字传输
(这里有个大坑,字符流的readLine()不会接收回车和换行,并且没收到回车和换行符号时,该方法处于阻塞状态,有兴趣了解可以点这个链接readLine方法产生阻塞的坑)
以下是我根据网上和自己了解写的一些文件编辑的方法
字节流写入(第一个参数是文件路径,第二个是要写入的数据):
public static void outputStream(String filePath, String data) {
File file = new File(filePath);
FileOutputStream fos = null;
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
//如果文件不存在则创建
try {
fos = new FileOutputStream(file, true);
//false是格式化后打开,true是非格式化打开
fos.write(data.getBytes());
//fos.write('\n');加上这个可以每输入完一段数据就用回车键分隔开来
fos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字节流读取(参数是文件路径):
public static void inputStream(String filePath) {
File file = new File(filePath);
InputStream fis = null;
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
//如果文件不存在则创建
try {
fis = new FileInputStream(file);
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fis.read(bytes)) != -1) {
//这里bytes是得到的数据,每次得到len个字节
//可将下面的打印语句替换成你想要对数据执行的操作
System.out.print(new String(bytes, 0, len));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字符流写入(第一个参数是文件路径,第二个是要写入的数据):
public static void bufferedWriter(String filePath, String data) {
File file = new File(filePath);
FileWriter fw = null;
BufferedWriter bw = null;
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
//false是格式化后打开,true是非格式化打开
fw = new FileWriter(file, true);
bw = new BufferedWriter(fw);
bw.write(data);
bw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字符流读取(注意:readLine()方法遇到’\n’和’\t’会认为是读取了一行,所以无法读取回车’\n’、换行’\n’):
public static void bufferedReader(String filePath) {
File file = new File(filePath);
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
String tempString = null;
try {
fis = new FileInputStream(file);
//utf-8是编码模式
isr = new InputStreamReader(fis, "utf-8");
br = new BufferedReader(isr);
// 一次读入一行,直到读入null为文件结束
while ((tempString = br.readLine()) != null) {
//这里你可以通过tempString来循环获得一行数据
System.out.print(tempString);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e1) {
}
}
if (isr != null) {
try {
isr.close();
} catch (IOException e1) {
}
}
if (br != null) {
try {
br.close();
} catch (IOException e1) {
}
}
}
}
文件复制(第一个参数是旧文件的路径,第二个是新文件的路径,如果路径没有文件则自动创建):
public static void copyFile(String oldFilePath,String newFilePath) {
File newfile = new File(newFilePath);
File oldfile = new File(oldFilePath);
if (!newfile.exists()) {
try {
newfile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
if (!oldfile.exists()) {
try {
oldfile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = new FileInputStream(oldfile);
outputStream = new FileOutputStream(newfile);
byte[] bytes = new byte[1024];
int len = 0;
while ((len=inputStream.read(bytes)) != -1) {
outputStream.write(bytes,0,len);
outputStream.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
替换文件中数据
这位老哥写很非常好(无法替换回车’\n’和换行’\t’)
其实还有socket连接来传输数据,不过我懒得写了=.=