首页编程java编程java读取二进制文件用什么?JAVA中读取文件(二进制,字符)内容的几种方

java读取二进制文件用什么?JAVA中读取文件(二进制,字符)内容的几种方

编程之家2023-10-1388次浏览

很多朋友对于java读取二进制文件用什么和JAVA中读取文件(二进制,字符)内容的几种方不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

java读取二进制文件用什么?JAVA中读取文件(二进制,字符)内容的几种方

java读取二进制文件中的数据的问题

二进制读取文件的形式中如果用的是read读取,那么此时就会出现乱码问题(中文是两个字节,read只能读取一个),所以都是通过readline方法来进行整行的内容读取来进行问题解决。

可以通过BufferedReader流的形式进行流缓存,之后通过readLine方法获取到缓存的内容。

BufferedReader bre= null;

java读取二进制文件用什么?JAVA中读取文件(二进制,字符)内容的几种方

try{

String file="D:/test/test.txt";

bre= new BufferedReader(new FileReader(file));//此时获取到的bre就是整个文件的缓存流

java读取二进制文件用什么?JAVA中读取文件(二进制,字符)内容的几种方

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,本文到此结束,希望对大家有所帮助。

java中abs什么用 在Java中什么意思 Math.abs(x)及同类的的公式氧化氢(氧化氢是什么)