java读取二进制文件用什么?JAVA中读取文件(二进制,字符)内容的几种方
很多朋友对于java读取二进制文件用什么和JAVA中读取文件(二进制,字符)内容的几种方不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
java读取二进制文件中的数据的问题
二进制读取文件的形式中如果用的是read读取,那么此时就会出现乱码问题(中文是两个字节,read只能读取一个),所以都是通过readline方法来进行整行的内容读取来进行问题解决。
可以通过BufferedReader流的形式进行流缓存,之后通过readLine方法获取到缓存的内容。
BufferedReader bre= null;
try{
String file="D:/test/test.txt";
bre= new BufferedReader(new FileReader(file));//此时获取到的bre就是整个文件的缓存流
while((str= bre.readLine())!= null)//判断最后一行不存在,为空结束循环
{
System.out.println(str);//原样输出读到的内容
};
备注:流用完之后必须close掉,如上面的就应该是:bre.close(),否则bre流会一直存在,直到程序运行结束。
怎样用Java读写二进制文件
import java.util.*;
import java.io.*;
class SmallFile{
static final int HEADLEN= 24;//头总长度
byte[] fileName= new byte[16];//列表文件名1:长度128想把它读到char[]里它的编码方式不是Unicode。在不确定编码方式的时候,最好直接用byte[]来存放
int offset;//列表文件地址1:长度32想把它读到int里
int length=-1;//列表文件长度1:长度32想把它读到int里
byte[] content;
public SmallFile(){
}
public SmallFile(byte[] fn, byte[] content){
Arrays.fill(fileName,(byte) 0);
if(fn!= null){
if(fn.length<= 16){
System.arraycopy(fn, 0, fileName, 0, fn.length);
}
else{
System.arraycopy(fn, 0, fileName, 0, 16);
}
}
this.content= content;
if(content!= null){
this.length= content.length;
}
else{
this.length=-1;
}
}
}
public class ReadBinary{
static final int HEADLEN= 8;//头总长度
private String filename;
private byte[] filehead= new byte[4];//文件头:长度32想把它读到char[]里它的编码方式不是Unicode
private int filecount=-1;//列表长度:长度32想把它读到int里假设他是3就会有3个列表文件名
private List<SmallFile> files= null;
public void setFilehead(byte[] fh){
if(fh== null)
return;
Arrays.fill(filehead,(byte) 0);
if(fh.length<= 4){
System.arraycopy(fh, 0, filehead, 0, fh.length);
}
else{
System.arraycopy(fh, 0, filehead, 0, 4);
}
}
public ReadBinary(String filename){
try{
readFromFile(filename);
}
catch(Exception ex){
System.out.println(ex.getMessage());
System.out.println("在载入数据文件时失败,因此视同为新建一个数据文件!");
this.filename= filename;
Arrays.fill(filehead,(byte) 0);
filecount= 0;
files= new ArrayList<SmallFile>();
}
}
public void readFromFile(String filename) throws Exception{
BufferedInputStream bin= new BufferedInputStream(new FileInputStream(
filename));
this.filename= filename;
DataInputStream in= new DataInputStream(bin);
in.read(filehead);//文件头:长度32想把它读到char[]里它的编码方式不是Unicode
filecount= in.readInt();//列表长度:长度32想把它读到int里假设他是3就会有3个列表文件名
if(files== null){
files= new ArrayList<SmallFile>();
}
else{
files.clear();
}
for(int i= 0; i< filecount; i++){
SmallFile file= new SmallFile();
in.read(file.fileName);
file.offset= in.readInt();//列表文件地址1:长度32想把它读到int里
file.length= in.readInt();//列表文件长度1:长度32想把它读到int里
files.add(file);
}
}
public void writeToFile() throws Exception{
String temp= filename+".tmp";//临时文件
boolean exists= false;
RandomAccessFile raf= null;
try{
raf= new RandomAccessFile(filename,"r");//文件存在则从文件读入
exists= true;
}
catch(Exception ex){
System.out.println("文件不存在,因此启用内存写入模式");
}
if(filecount!= files.size()){
throw new Exception("怪事,居然不相同??");
}
DataOutputStream out= new DataOutputStream(new BufferedOutputStream(new
FileOutputStream(temp)));
//1、写总文件头
out.write(filehead);
out.writeInt(filecount);
//2、写列表头
int sumlength= 0;
for(int i= 0; i< files.size(); i++){
SmallFile file= files.get(i);
out.write(file.fileName);
if(file.length< 0){
throw new Exception("怪事,文件长度怎么可能小于0?");
}
else{
out.writeInt(ReadBinary.HEADLEN+ SmallFile.HEADLEN* filecount+
sumlength);
sumlength+= file.length;
out.writeInt(file.length);
}
}
//3、写文件内容
for(int i= 0; i< files.size(); i++){
SmallFile file= files.get(i);
if(file.content!= null&&(file.length== file.content.length)){
out.write(file.content);
}
else if(exists){
raf.seek(file.offset);
byte[] b= new byte[file.length];
raf.read(b);
System.out.println("b:"+ new String(b));
out.write(b);
}
else{
throw new Exception("怪事,又不能从内存读,又不能从文件读。这活没法干了!");
}
}
out.close();
if(raf!= null){
raf.close();
raf= null;
}
System.gc();
//把原先的文件删除
File f= new File(filename);
f.delete();
//再把临时文件改名到正式文件
File f2= new File(temp);
f2.renameTo(f);
}
public void addFile(SmallFile file){
if(files!= null){
filecount++;
files.add(file);
}
}
public static void test1(){
ReadBinary rb= new ReadBinary("f:\\temp\\rb.dat");
rb.setFilehead("HEAD1234567890122222222222222222".getBytes());
SmallFile f= new SmallFile("第1个文件".getBytes(),"第1个文件的内容".getBytes());
rb.addFile(f);
try{
rb.writeToFile();
}
catch(Exception ex){
ex.printStackTrace();
}
}
public static void test2(){
ReadBinary rb= new ReadBinary("f:\\temp\\rb.dat");
rb.setFilehead("HEA".getBytes());
SmallFile f= new SmallFile("第2个文件".getBytes(),"第2个文件的内容".getBytes());
rb.addFile(f);
try{
rb.writeToFile();
}
catch(Exception ex){
ex.printStackTrace();
}
}
public static void main(String[] args){
//test1();
test2();
}
}
JAVA中读取文件(二进制,字符)内容的几种方
JAVA中读取文件内容的方法有很多,比如按字节读取文件内容,按字符读取文件内容,按行读取文件内容,随机读取文件内容等方法,本文就以上方法的具体实现给出代码,需要的可以直接复制使用
public class ReadFromFile{
/**
*以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。
*/
public static void readFileByBytes(String fileName){
File file= new File(fileName);
InputStream in= null;
try{
System.out.println("以字节为单位读取文件内容,一次读一个字节:");
//一次读一个字节
in= new FileInputStream(file);
int tempbyte;
while((tempbyte= in.read())!=-1){
System.out.write(tempbyte);
}
in.close();
} catch(IOException e){
e.printStackTrace();
return;
}
try{
System.out.println("以字节为单位读取文件内容,一次读多个字节:");
//一次读多个字节
byte[] tempbytes= new byte[100];
int byteread= 0;
in= new FileInputStream(fileName);
ReadFromFile.showAvailableBytes(in);
//读入多个字节到字节数组中,byteread为一次读入的字节数
while((byteread= in.read(tempbytes))!=-1){
System.out.write(tempbytes, 0, byteread);
}
} catch(Exception e1){
e1.printStackTrace();
} finally{
if(in!= null){
try{
in.close();
} catch(IOException e1){
}
}
}
}
/**
*以字符为单位读取文件,常用于读文本,数字等类型的文件
*/
public static void readFileByChars(String fileName){
File file= new File(fileName);
Reader reader= null;
try{
System.out.println("以字符为单位读取文件内容,一次读一个字节:");
//一次读一个字符
reader= new InputStreamReader(new FileInputStream(file));
int tempchar;
while((tempchar= reader.read())!=-1){
//对于windows下,\r\n这两个字符在一起时,表示一个换行。
//但如果这两个字符分开显示时,会换两次行。
//因此,屏蔽掉\r,或者屏蔽\n。否则,将会多出很多空行。
if(((char) tempchar)!='\r'){
System.out.print((char) tempchar);
}
}
reader.close();
} catch(Exception e){
e.printStackTrace();
}
try{
System.out.println("以字符为单位读取文件内容,一次读多个字节:");
//一次读多个字符
char[] tempchars= new char[30];
int charread= 0;
reader= new InputStreamReader(new FileInputStream(fileName));
//读入多个字符到字符数组中,charread为一次读取字符数
while((charread= reader.read(tempchars))!=-1){
//同样屏蔽掉\r不显示
if((charread== tempchars.length)
&&(tempchars[tempchars.length- 1]!='\r')){
System.out.print(tempchars);
} else{
for(int i= 0; i< charread; i++){
if(tempchars[i]=='\r'){
continue;
} else{
System.out.print(tempchars[i]);
}
}
}
}
} catch(Exception e1){
e1.printStackTrace();
} finally{
if(reader!= null){
try{
reader.close();
} catch(IOException e1){
}
}
}
}
/**
*以行为单位读取文件,常用于读面向行的格式化文件
*/
public static void readFileByLines(String fileName){
File file= new File(fileName);
BufferedReader reader= null;
try{
System.out.println("以行为单位读取文件内容,一次读一整行:");
reader= new BufferedReader(new FileReader(file));
String tempString= null;
int line= 1;
//一次读入一行,直到读入null为文件结束
while((tempString= reader.readLine())!= null){
//显示行号
System.out.println("line"+ line+":"+ tempString);
line++;
}
reader.close();
} catch(IOException e){
e.printStackTrace();
} finally{
if(reader!= null){
try{
reader.close();
} catch(IOException e1){
}
}
}
}
/**
*随机读取文件内容
*/
public static void readFileByRandomAccess(String fileName){
RandomAccessFile randomFile= null;
try{
System.out.println("随机读取一段文件内容:");
//打开一个随机访问文件流,按只读方式
randomFile= new RandomAccessFile(fileName,"r");
//文件长度,字节数
long fileLength= randomFile.length();
//读文件的起始位置
int beginIndex=(fileLength> 4)? 4: 0;
//将读文件的开始位置移到beginIndex位置。
randomFile.seek(beginIndex);
byte[] bytes= new byte[10];
int byteread= 0;
//一次读10个字节,如果文件内容不足10个字节,则读剩下的字节。
//将一次读取的字节数赋给byteread
while((byteread= randomFile.read(bytes))!=-1){
System.out.write(bytes, 0, byteread);
}
} catch(IOException e){
e.printStackTrace();
} finally{
if(randomFile!= null){
try{
randomFile.close();
} catch(IOException e1){
}
}
}
}
/**
*显示输入流中还剩的字节数
*/
private static void showAvailableBytes(InputStream in){
try{
System.out.println("当前字节输入流中的字节数为:"+ in.available());
} catch(IOException e){
e.printStackTrace();
}
}
public static void main(String[] args){
String fileName="C:/temp/newTemp.txt";
ReadFromFile.readFileByBytes(fileName);
ReadFromFile.readFileByChars(fileName);
ReadFromFile.readFileByLines(fileName);
ReadFromFile.readFileByRandomAccess(fileName);
}
}
OK,本文到此结束,希望对大家有所帮助。