文件管理 · 2022年8月21日

java二进制转换成文件|二进制文件与文本文件相互转化 java实现~

Ⅰ 如何用java或C语言解析二进制文件为文本文件

在学习C语言fopen()函数后,知道它的第二个参数是标志字符串。如果字符串中出现'b',则表明是以打开二进制(binary)文件,否则是打开文本文件。那么什么是文本文件,什么是二进制文件呢?从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。 ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为: ASC码: 00110101 00110110 00110111 00111000 ↓ ↓↓ ↓ 十进制码: 5678 共占用4个字节。ASCII码文件可在屏幕上按字符显示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。 由于是按字符显示,因此能读懂文件内容。 二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为:00010110 00101110只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。文本文件与二进制文件的区别在系统存储上它们实际上并没有什么区别,都是以二进制的方式存储于硬盘上。之所以分二进制文件和文本文件,主要是逻辑上的区分,文本文件更人为可读而已。站在编程的角度看,文本文件是基于字符编码过后的,比如常见的就有ascii编码,gbk编码,unicode编码等,文本工具直接打开人为可读。而二进制文件是基于值的编码,这个值到底是什么,完全可自定义,所以可以说二进制文件是一种特殊编码的文件。如果用java编程,可能就根本没遇到过以二进制打开和文本文件打开这两种方式。java里面有字符流和字节流,字符流是对字节流的封装,有编码解码,而字节流操作的则是byte数组,所以更容易理解。python的文件读写方式则更贴近C。因为python和java他们底层都是C,所以很有必要弄清C的读写文件方式。 在Windows和DOS系统中,狭义的文本文件是指扩展名为txt的文件。实际上,那些没有规定格式的,由可理解的的ASCII以及其他编码文字组成的文件都是文本文件,如C源程序文件,HTML超文本,XML。除此之外的其他文件都是二进制文件,如Word文件DOC,图象格式文件JPG。实际上,fopen()的 b 标志不但可以打开二进制文件,还可以打开文本文件,同样,不带 b 标志也可以打开文本文件。既然这样,为什么还要区分两种打开方式呢?因为这两种方式在读写文件时的操作是不一样的。二进制方式很简单,读文件时,会原封不动的读出文件的全部内容,写的时候,也是把内存缓冲区的内容原封不动的写到文件中。而文本方式就不一样了,在写文件时,会将换行符号CRLF(0x0D 0x0A)全部转换成单个的0x0A,并且当遇到结束符CTRLZ(0x1A)时,就认为文件已经结束。相应的,写文件时,会将所有的0x0A换成0x0D0x0A。所以,若使用文本方式打开二进制文件时,就很容易出现文件读不完整,或内容不对的错误。即使是用文本方式打开文本文件,也要谨慎使用,比如复制文件,就不应该使用文本方式。要特别注意的是,上面这样的说法仅适用于DOS和Windows系统。在Unix和其他一些系统中,没有文本方式和二进制方式的区分,使不使用'b'标志都是一样的。这是由于不同操作系统对文本文件换行符的定义,和C语言中换行符的定义有所不同而造成的。如上文已提到,DOS和Windows系统使用CRLF(0x0D 0x0A)即\r\n双字节作为文本文件换行符,而Unix文本文件的换行符只有一个字节LF(0x0A)为。在C语言中,也是以LF即'\n'为换行符。由于DOS/Windows定义的换行符和C语言的不一致,C语言的标准输入输出函数适行读写文本文件时,就适行了CRLF->LF的转换。而Unix的定义和C语言的是一样的,就不必转换了。那么,为什么会有定义不一致的情况呢,这纯属历史原因。当初C是在Unix上发展的,对换行的定义自然就一样了。其后C被引入到DOS系统,为了使原有的C程序能不加修改的读写DOS的文本文件,所以就在文件读写上做了修改。随着DOS/Windows成为主流平台,这个当初为了兼容而做的修改给众多的C语言开发者添了这样一个小小的麻烦。所以,二进制和文本模式的区别就在于对于换行符和一些非可见字符上面的转化,所以安全起见,是使用二进制读取会比较安全一些。

Ⅱ java里怎样把文件转换成二进制

转换文件成为二进制数据并保存的Java代码:

取出数据并还原文件到本地的java代码:

[java]view plain//读取数据库二进制文件

publicvoidreaderJpg()throwsSQLException

{

connection=connectionManager.getconn();//自己连接自己的数据库

StringsqlString="selectimagesfromsave_imagewhereid=4";//从数据库中读出要还原文件的二进制码,这里我读的是自己的数据库id为4的文件

Filefile=newFile("E:\1.jpg");//本地生成的文件

if(!file.exists())

{

try{

file.createNewFile();

}catch(Exceptione){

e.printStackTrace();

}

}

try{

byte[]Buffer=newbyte[4096*5];

statement=connection.prepareStatement(sqlString);

resultSet=statement.executeQuery();

if(resultSet.next())

{

FileOutputStreamoutputStream=newFileOutputStream(file);

InputStreamiStream=resultSet.getBinaryStream("images");//去字段用getBinaryStream()

intsize=0;

while((size=iStream.read(Buffer))!=-1)

{

System.out.println(size);

outputStream.write(Buffer,0,size);

}

}

}catch(Exceptione){

e.printStackTrace();

}

}

Ⅲ 在java中怎么将二进制字符串转换为文件流

ByteArrayInputStream is = new ByteArrayInputStream(String.getBytes("utf-8"));

Ⅳ 二进制文件与文本文件相互转化 java实现~

public class WriteTextFileExample { public static void main(String[] args ) { try { FileOutputStream out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(fileName2))); DataInputStream in=new DataInputStream( new BufferedInputStream( new FileInputStream(fileName))); int l=in.readInt(); //你必须要知道你提取的2进制文件里的数据对应的是什么类型的,数据量有多少/*System.out.println(dis.available()); System.out.println(dis.readBoolean()); char c=(char)dis.readChar(); System.out.println(c); System.out.println(dis.readDouble()); System.out.println(dis.readFloat()); System.out.println(dis.readInt()); System.out.println(dis.readLong()); System.out.println(dis.readShort()); System.out.println(dis.readUTF()); *///读取的时候一定要一一对应,不然取出来也不能用 out.write(String.valueOf(l));//请根据你的二进制文件自行设定执行次数 } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { if (bw != null) bw.close(); if (fos != null) fos.close(); } catch (IOException ie) { } } }}参考:

Ⅳ java怎么将二进制转化成字符串

import java.io.UnsupportedEncodingException;import java.util.Arrays; /* * String(byte[] bytes, String charsetName):通过指定的字符集解码字节数组 * byte[] getBytes(String charsetName):使用指定的字符集合把字符串编码为字节数组 * * 编码:把看得懂的变成看不懂的 * String — byte[] * * 解码:把看不懂的变成看得懂的 * byte[] — String * * 举例:谍战片(发电报,接电报) * * 码表:小本子 * 字符 数值 * * 要发送一段文字: * 今天晚上在老地方见 * * 发送端:今 — 数值 — 二进制 — 发出去 * 接收端:接收 — 二进制 — 十进制 — 数值 — 字符 — 今 * * 今天晚上在老地方见 * * 编码问题简单,只要编码解码的格式是一致的。 */public class StringDemo { public static void main(String[] args) throws UnsupportedEncodingException { String s = "你好"; // String — byte[] byte[] bys = s.getBytes(); // [-60, -29, -70, -61] // byte[] bys = s.getBytes("GBK");// [-60, -29, -70, -61] // byte[] bys = s.getBytes("UTF-8");// [-28, -67, -96, -27, -91, -67] System.out.println(Arrays.toString(bys)); // byte[] — String String ss = new String(bys); // 你好 // String ss = new String(bys, "GBK"); // 你好 // String ss = new String(bys, "UTF-8"); // ??? System.out.println(ss); }}

Ⅵ 用java实现java的2进制文件字节序转换到C/C++的2进制文件字节序

package admit.action;/*用JAVA读取各种计算机文件系统的文件列表 当你安装了jdk,在jdk的类库里,有一个标准的File类,通过该类,可以很方便的实现浏览各种文件系统的功能。 File类: java.lang.Object | +–java.io.File File类扩展了Object对象,实现了Serializable, Comparable定义的接口,可以通过File的一个实例对jvm上的文件系统进行各种操作,下面我编写了一个FileViewer类,该类通过Iterator类将一个文件列表实现对列表的迭代操作 FileViewer.java */import java.io.File; import java.util.ArrayList;import java.util.Date; import java.util.Iterator; import java.util.Vector;public class ReadPath { File myDir; File[] contents; Vector vectorList; Iterator currentFileView; File currentFile; String path; public ReadPath() { path = new String(""); vectorList = new Vector(); } public ReadPath(String path) { this.path = path; vectorList = new Vector(); } /** * 设置浏览的路径 */ public void setPath(String path) { this.path = path; } /*************************************************************************** * 返回当前目录路径 */ public String getDirectory() { return myDir.getPath(); } /** * 刷新列表 */ public void refreshList() { if (this.path.equals("")) path = "c:\\"; myDir = new File(path); vectorList.clear(); contents = myDir.listFiles(); // 重新装入路径下文件 for (int i = 0; i < contents.length; i++) { vectorList.add(contents[i]); } currentFileView = vectorList.iterator(); } /** * 移动当前文件集合的指针指到下一个条目 * * @return 成功返回true,否则false */ public boolean nextFile() { while (currentFileView.hasNext()) { currentFile = (File) currentFileView.next(); return true; } return false; } /** * 返回当前指向的文件对象的文件名称 */ public String getFileName() { return currentFile.getName(); } /** * 返回当前指向的文件对象的文件尺寸 */ public String getFileSize() { return new Long(currentFile.length()).toString(); } /** * 返回当前指向的文件对象的最后修改日期 */ public String getFileTimeStamp() { return new Date(currentFile.lastModified()).toString(); } /** * 返回当前指向的文件对象是否是一个文件目录 */ public boolean getFileType() { return currentFile.isDirectory(); } /* * 通过setPath()方法设定要浏览的目录(注意如果操作系统为微软操作系统,每个路径分隔符应写成两个斜杠\),nextFile()方法用来移动列表记录,可以通过getFileName()得到文件或文件夹名称,通过getFileSize()得到文件尺寸,通过getFileTimeStamp()得到文件的最后修改时间,通过getFileType()判断是否是一个文件目录。 * 编写一个test例子测试这个FileViewer类 */ public ArrayList okpath(){ ReadPath f = new ReadPath(); f.setPath("c:\\aaa\\"); f.refreshList(); ArrayList list = new ArrayList(); while (f.nextFile()) { list.add(f.path+f.getFileName()); } return list; } /* public static void main(String[] args) { ReadPath f = new ReadPath(); ArrayList list1 = f.okpath(); for(int j=0;j<list1.size();j++){ System.out.println(list1.get(j)); } }*/ } package admit.action;import java.sql.*; import java.util.ArrayList;import java.io.*;import oracle.sql.*;public class WriteBlob { public static void main(String[] args) { try { DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.100:1521:adminsys","admit","wuyue"); conn.setAutoCommit(false); ReadPath readPath=new ReadPath(); ArrayList list = readPath.okpath();/* String ff[]=new String[2]; String fileName = "c://tupian.gif"; */ for(int i=0;i<list.size();i++){ System.out.println("路径名="+list.get(i).toString()); File f = new File(list.get(i).toString()); FileInputStream fin = new FileInputStream(f); BLOB blob = null; PreparedStatement pstmt = conn.prepareStatement("insert into javatest(name,context) values(?,empty_blob())"); pstmt.setString(1,""+list.get(i).toString()+""); pstmt.executeUpdate(); pstmt.close(); pstmt = conn.prepareStatement("select context from javatest where name= ? for update"); pstmt.setString(1,""+list.get(i).toString()+""); ResultSet rset = pstmt.executeQuery(); if (rset.next()) blob = (BLOB) rset.getBlob(1); pstmt = conn.prepareStatement("update javatest set context=? where name=?"); OutputStream out = blob.getBinaryOutputStream(); int count = -1, total = 0; byte[] data = new byte[(int)fin.available()]; fin.read(data); out.write(data); /* byte[] data = new byte[blob.getBufferSize()]; 另一种实现方法,节省内存 while ((count = fin.read(data)) != -1) { total += count; out.write(data, 0, count); } */ fin.close(); out.close(); pstmt.setBlob(1,blob); pstmt.setString(2,""+list.get(i).toString()+""); pstmt.executeUpdate(); pstmt.close(); System.out.println("插入成功!!!"); } conn.commit(); conn.close(); } catch (SQLException e) { System.err.println(e.getMessage()); e.printStackTrace(); } catch (IOException e) { System.err.println(e.getMessage()); } } }

Ⅶ java怎么数据库中的二进制转换成图片类型

java对于文件的处理都可以用二进制流处理。new file然后将流写进去就可以了,根据你命名的文件后缀名去区分是什么类型的文件,对于二进制流来说没有什么类型的,所以你说的这种转换我不太明白。如果是将存储在数据库的二进制流拿到之后展示,有两种方式,一种是将二进制流写入到磁盘然后通过路径访问,一种是直接输出二进制流到呈现的view(如果你的view支持的话)。

Ⅷ JAVA如何将二进制数转换成文件

如果你是用二进制流保存的,把后缀名改为avi应该就可以了

Ⅸ 在java里面 把 文件转换成二进制流 然后在.net里面 再把二进制流转化成文件…….

方法1:专门写个函数把数据从数据库中读出,作为文件形(如test.jpg)式保存在硬盘上,然后在html中显示<img src="test.jpg"/ ———————————————————————- 方法2:写一个servlet public class GetPhotoAction extends Action { private static final String CONTENT_TYPE = "image/gif; charset=GBK";//输出类型为 图像 public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { int empid; try { empid = Integer.parseInt(request.getParameter("empid"));//员工id } catch (NumberFormatException e) { empid = 0; } response.setContentType(CONTENT_TYPE); //设置输出类型 OutputStream out = null; try { out = response.getOutputStream();//得到输出流 } catch (IOException ex1) { ex1.printStackTrace(System.out); } try { byte[] photo = Operator.getDBPhoto(empid);//从数据库中读出文件 if (photo!=null && photo.length > 0) { out.write(photo); //输出到网页上 } } catch (Exception ex) { ex.printStackTrace(System.out); } return null; } } 我是在struct中写的,如果你用的是jsp+servlet,把Action改成Servlet即可. 由于CONTENT_TYPE = "image/gif; charset=GBK",所以你直接在浏览器中访问这个servlet的话只能看到一张大的图片,就算写了out.write("aaaaaaaaa"),也不会看到字符输出,所以你只能在jsp中调用这个servlet <img src="getPhotoAction.do?empid=123"alt="照片" width="185" height="218">