java如何把二进制内容(字符串)保存成文件

二进制内容由xml中提交过来的,需要把它转成文件保存到指定目录中。
二进制内容:FFD8FFE000104A46494600010100000100010000FFDB0043000503040404030504040405050506070C08070707070F.....

回答: java如何把二进制内容(字符串)保存成文件

  1. 先将其hex解码然后写输出流
    /*
     * @(#)TestHex.java
     *
     * Summary: Demonstrate how to handle hex strings.
     *
     * Copyright: (c) 2009-2010 Roedy Green, Canadian Mind Products, http://mindprod.com
     *
     * Licence: This software may be copied and used freely for any purpose but military.
     *          http://mindprod.com/contact/nonmil.html
     *
     * Requires: JDK 1.6+
     *
     * Created with: IntelliJ IDEA IDE.
     *
     * Version History:
     *  1.0 2009-06-05 - initial version.
     */
    package com.mindprod.example;
    
    
    import static java.lang.System.out;
    
    /**
     * Demonstrate how to handle hex strings.
     *
     * @author Roedy Green, Canadian Mind Products
     * @version 1.0 2009-06-05 - initial version.
     * @since 2009-06-05
     */
    public final class TestHex
        {
        /**
         * precomputed translate table for chars 0..'f'
         */
        private static byte[] correspondingNibble = new byte['f' + 1];
    // -------------------------- PUBLIC STATIC METHODS --------------------------
    
        /**
         * Convert a hex string to an unsigned byte array.
         * Permits upper or lower case hex.
         *
         * @param s String must have even number of characters.
         *          and be formed only of digits 0-9 A-F or
         *          a-f. No spaces, minus or plus signs.
         *
         * @return corresponding unsigned byte array. see http://mindprod.com/jgloss/unsigned.html
         */
        public static byte[] fromHexString( String s )
            {
            int stringLength = s.length();
            if ( ( stringLength & 0x1 ) != 0 )
                {
                throw new IllegalArgumentException( "fromHexString requires an even number of hex characters" );
                }
            byte[] bytes = new byte[stringLength / 2];
    
            for ( int i = 0, j = 0; i < stringLength; i += 2, j++ )
                {
                int high = charToNibble( s.charAt( i ) );
                int low = charToNibble( s.charAt( i + 1 ) );
                // You can store either unsigned 0..255 or signed -128..127 bytes in a byte type.
                bytes[ j ] = ( byte ) ( ( high << 4 ) | low );
                }
            return bytes;
            }
    
    // -------------------------- STATIC METHODS --------------------------
    
        static
            {
            // only 0..9 A..F a..f have meaning. rest are errors.
            for ( int i = 0; i <= 'f'; i++ )
                {
                correspondingNibble[ i ] = -1;
                }
            for ( int i = '0'; i <= '9'; i++ )
                {
                correspondingNibble[ i ] = ( byte ) ( i - '0' );
                }
            for ( int i = 'A'; i <= 'F'; i++ )
                {
                correspondingNibble[ i ] = ( byte ) ( i - 'A' + 10 );
                }
            for ( int i = 'a'; i <= 'f'; i++ )
                {
                correspondingNibble[ i ] = ( byte ) ( i - 'a' + 10 );
                }
            }
    
        /**
         * convert  a single char to corresponding nibble using a precalculated array.
         * Based on code by:
         * Brian Marquis
         * Orion Group Software Engineers http://www.ogse.com
         *
         * @param c char to convert. must be 0-9 a-f A-F, no
         *          spaces, plus or minus signs.
         *
         * @return corresponding integer  0..15
         * @throws IllegalArgumentException on invalid c.
         */
        private static int charToNibble( char c )
            {
            if ( c > 'f' )
                {
                throw new IllegalArgumentException( "Invalid hex character: " + c );
                }
            int nibble = correspondingNibble[ c ];
            if ( nibble < 0 )
                {
                throw new IllegalArgumentException( "Invalid hex character: " + c );
                }
            return nibble;
            }
    
        /**
         * code not used, for explanation only.
         * convert a single char to corresponding nibble.
         * Slow version, easier to understand.
         *
         * @param c char to convert. must be 0-9 a-f A-F, no
         *          spaces, plus or minus signs.
         *
         * @return corresponding integer
         */
        private static int slowCharToNibble( char c )
            {
            if ( '0' <= c && c <= '9' )
                {
                return c - '0';
                }
            else if ( 'a' <= c && c <= 'f' )
                {
                return c - 'a' + 0xa;
                }
            else if ( 'A' <= c && c <= 'F' )
                    {
                    return c - 'A' + 0xa;
                    }
                else
                    {
                    throw new IllegalArgumentException( "Invalid hex character: " + c );
                    }
            }
    
    // --------------------------- main() method ---------------------------
    
        /**
         * Test harness
         *
         * @param args not used
         */
        public static void main( String[] args )
            {
            String hexString = "FFD8FFE000104A46494600010100000100010000FFDB0043000503040404030504040405050506070C08070707070F";
            out.println( hexString );
            // convert hex string to an array of bytes
            byte[] bytes = fromHexString( hexString );
            out.println( bytes.length + " bytes long" );
    try{
            OutputStream os=new FileOutputStream("d:\a.data");
    os.write(bytes);
    os.flush();
    os.close();
    }catch(Exception ex){
    ex.printStackTrace();
    }
            }
        }
    

RTMP red5流媒体服务器在接收直播流的同时,保存成文件

  1. Q
    RTMP red5流媒体服务器在接收直播流的同时,保存成文件, 这块应该是有个什么开关或配置,但一直没找到是哪块,  目前看red5例子中有3种模式, live   record    append  ,  其中record 模式是我需要的,就是不知道在  RTMP 协议中哪设置
  2. A
    有没有出现red5播放的时候卡死的情况?

PB中怎么将数据库内的Image类型的数据保存成文件

  1. Q
    PB中怎么将数据库内的Image类型的数据保存成文件,就是将数据库内的图片保存到某个文件夹内
  2. A

    string as_filename //图像文件名
    blob  ablb_bitmap //图像
    Integer li_fnum
    ULong lul_total, lul_bytes, lul_length

    li_fnum = FileOpen(as_filename, StreamMode!, Write!, LockWrite!, Replace!)
    If li_fnum > 0 Then
    lul_length = Len(ablb_bitmap)
    DO WHILE lul_total < lul_length
    lul_bytes = FileWrite(li_fnum, &
    BlobMid(ablb_bitmap, lul_total + 1))
    lul_total += lul_bytes
    LOOP
    FileClose(li_fnum)
    Else
    Return -1
    End If

在录制屏幕,保存成文件的同时,如何实现读该文件,实现播放的功能

  1. Q
    场景:在本地操作桌面,而后把屏幕的变化过程录制成文件,而后本地特定的播放器播放该文件,还可以实现?
    为了讨论简单,我这里把网络层忽略了,只考虑本地的保存和播放。

    问题:由于在播放的过程中,还在进行录制工作,因此文件是写打开状态的,同时文件还是不完整的,这时能成功的实现播放功能吗。
  2. A
    kankan98407(看看): 先生已经说的很清楚了,我就再解释一下.
    保存当前读的文件指针. 写的文件指针.当从读切换到写的时候,SetFilePointer(pWritePtr)

    同样当从写切换到读的时候, SetFilePointer(pReadPtr); 未了保证读写的位置正确,使用变量记录,他们各自的变化.

图片保存为二进制流要转成BASE64的格式问题

  1. Q
    我将图转换成二进制流保存于 数据库, 对应的内容是
    0xFFD8FFE000104A46494600010101012C012C0000FFDB00430006040506050406060506070706080A100A0A09090A140E0F0C10171418181714161 。。。 。。。

    但是当我把这个二进制流化成图片显示另存为JPG文件后通过网上的转换 http://www.fishlee.net/Tools/GetImageBase64Code#codeResult 

    base64结果:/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2w 。。。 。。。

    ------------------------------------------------------------------------------------------------------------------------
    好了,我们看一下 同样的JPG图,得到的 二进制流,与 base64 编码完全不同,

    请问大家有什么办法, 帮我把我的二进制流 ,转成  base64编码?
  2. A
    还原不到原始的
    因为你在一开始转换的时候就已经把字符串截断了
     Convert.FromBase64String(base64data.Substring(1, base64data.Length - 2));

JAVA 字符串拼接成可执行的表达式,求解决方案。。。

  1. Q
    JAVA 字符串拼接成可执行的表达式,求解决方案。。。

    比如
    String ex="value1>value2&&value1>value2||value1<value2";
    解析后
    1==1&&1>2||1!=2
  2. A
    java   js 引擎

java 发送post请求,内容为xml

  1. Q
    一个web service 提供了post请求方式,用户发送一个xml请求文档比如:
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Execute>
    <Input>
    <owsIdentifier>name</owsIdentifier>
    <Data>
    <LiteralData>zhangsan</LiteralData>
    </Data>
    </Input>
    <ResponseForm>
    <RawDataOutput mimeType="text/xml">
    <owsIdentifier>info</owsIdentifier>
    </RawDataOutput>
    </ResponseForm>
    </Execute>

    服务端会返回zhangsan的信息。上面的xml文档在浏览器中通过post表单方式正常执行。
    但是在java中就不行了java种代码如下:
    package common.post;
    
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    
    public class PostTest {
    	void testPost(String urlStr) {
    		try {
    			URL url=new URL(urlStr);
    			URLConnection con=url.openConnection();
    			con.setDoOutput(true);
    			OutputStreamWriter out=new OutputStreamWriter(con.getOutputStream());
    			String request=readFile();
    			System.out.println("Exedata satart\n"+request+"\nExe end");
    			out.write(new String(request.getBytes("ISO-8859-1")));
    			
    	
    			out.flush();
    			out.close();
    			BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream()));
    			String line="";
    			for(line=br.readLine();line!=null;line=br.readLine()) {
    				System.out.println(line);
    			}
    		} catch (MalformedURLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	private String readFile() {
    		StringBuilder sb=new StringBuilder();
    		try {
    			BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("E:/raw.xml")));
                              //这里的raw.file内容就是 上面那个xml片段,就是读取内容,将请求的xml保存成字符串 进行post发送
    			String line="";
    			for(line=br.readLine();line!=null;line=br.readLine()) {
    				sb.append(line+"\n");
    			}
    			
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return sb.toString();
    	}
    	public static void main(String[] args) {
    		String url="http://localhost:9000/WebService";
    		new PostTest().testPost(url);
    	}
    }
    
    


    结果一直是
    There went something wrong with parsing the POST data: Premature end of file.
    这是什么原因

    问题补充:
    好像发现问题了:
    我在webservice中有这个代码,是用来截取请求的字段的:
    InputStream is=......;			
    DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
    			fac.setNamespaceAware(true);
    //BufferedReader br=new BufferedReader(new InputStreamReader(is));
    //FileOutputStream fos=new FileOutputStream("E:/is.xml");
    //for(String line=br.readLine();line!=null;line=br.readLine()) {
    //	fos.write((line+"\n").getBytes());
    //}
    //fos.close();
    //br.close();
    			// parse the InputStream to create a Document
    			doc = fac.newDocumentBuilder().parse(is);
    


    后来我把中间那个网文件写入的代码注释后 就没问题了 是不是一个InputStream只能用一次啊?
    如果我想实现如上功能,就是先写入到文件中,然后解析,这个InputStream该怎么搞?复制一个?
    问题补充:
    引用你都已经先写到文件中了,再解析就应该是对文件的内容进行解析了,而不是再去得到原来的InputStream输入流再进行操作

    写到文件只是为了测试用的,这么说InputStream写入到文件后,就不能继续用了么?
    问题补充:
    引用不是,看错了你的代码,

    你只用了一次,程序看来是没什么问题

    现在问题已经解决了
       1. InputStream is=......;            
       2. DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();  
       3.             fac.setNamespaceAware(true);  
       4. //BufferedReader br=new BufferedReader(new InputStreamReader(is));  
       5. //FileOutputStream fos=new FileOutputStream("E:/is.xml");  
       6. //for(String line=br.readLine();line!=null;line=br.readLine()) {  
       7. //  fos.write((line+"\n").getBytes());  
       8. //}  
       9. //fos.close();  
      10. //br.close();  
      11.             // parse the InputStream to create a Document  
      12.             doc = fac.newDocumentBuilder().parse(is);  

    还是这个代码 如果注释部分去掉注释 也就是执行的话 就会出错 如果注释掉就没问题.
    我现在的疑问是如果注释代码执行,InputStream就用了2次,是不是因为这个原因,第一次是写入文件,第二次是parse,第二次这个流是不是已经空了,所以异常发生?
    引用web service的调用,我怀疑是不能以out.write(new String(request.getBytes("ISO-8859-1")));把请求内容写进去就当是post
    我觉得可能不是这个问题 因为con.setDoOutput(true); 就意味着post了
  2. A
    不是,看错了你的代码,

    你只用了一次,程序看来是没什么问题,

    web service的调用,我怀疑是不能以out.write(new String(request.getBytes("ISO-8859-1")));把请求内容写进去就当是post


    URL url=new URL(urlStr);
    HttpURLConnection con=(HttpURLConnection) url.openConnection();
    con.setRequestMethod("POST");

java 将当前的窗体对象压缩成zip文件

  1. Q
    功能要求:
        创建一个名为“测试用的窗体”的空白窗体。程序运行后自动打开该窗体,用户在该窗体中输入一些英文,再单击“选择文件夹”按钮,程序自动打开文件选择器,用户选定保存压缩文件的位置,最后单击“序列化”按钮,程序自动将将当前的窗体对象压缩成zip文件。
    老师要求我们做一个课程设计是将当前窗体对象压缩成zip文件。有哪位能人会吗?


  2. A
    主窗体类

    /**
     * 
     */
    package save_frame;

    import java.awt.EventQueue;
    import java.awt.FlowLayout;
    import java.awt.Point;
    import java.awt.Rectangle;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    import java.util.zip.ZipOutputStream;

    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import javax.swing.filechooser.FileFilter;
    import javax.swing.filechooser.FileNameExtensionFilter;

    /**
     *
     * @author zys59三仙半(QQ:597882752)<br>
     *         创建时间:2015年6月18日 上午12:34:16
     */
    public class MainFrame extends JFrame {
    private static final long serialVersionUID = -8086319283480772888L;

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
    public void run() {
    try {
    MainFrame frame = new MainFrame();
    frame.setVisible(true);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    });
    }

    private BeSaveFrame beSaveFrame = null;

    // private String filepath = "d:\\saved.frm";

    /**
     * Create the frame.
     */
    public MainFrame() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 479, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));

    JButton btnRead = new JButton("读取");
    btnRead.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    // 选择保存窗体的ZIP文件
    JFileChooser chooser = new JFileChooser(MainFrame.class
    .getResource("").toString());
    FileFilter filter = new FileNameExtensionFilter("ZIP文件(*.zip)",
    "zip");
    chooser.setFileFilter(filter);
    int action = chooser.showOpenDialog(MainFrame.this);
    if (action != JFileChooser.APPROVE_OPTION) {
    return;
    }
    String StrZipFile = chooser.getSelectedFile().getAbsolutePath();
    // 如果有显示中的窗体,则销毁它
    if (beSaveFrame != null) {
    beSaveFrame.dispose();
    }
    // 读取ZIP文件
    ZipFile zipFile = null;
    try {
    zipFile = new ZipFile(StrZipFile);
    // 读取ZIP文件中的窗体存档文件,并显示
    ZipEntry entry = zipFile.getEntry("saved.frm");
    if (entry != null) {
    InputStream is = zipFile.getInputStream(entry);
    ObjectInputStream ois = new ObjectInputStream(is);
    beSaveFrame = (BeSaveFrame) (ois.readObject());
    beSaveFrame.setLocation(MainFrame.this.getFrameLoc());
    beSaveFrame.setVisible(true);
    } else {
    System.out.println("压缩包中不存在合法的窗体存档文件");
    }
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    } catch (ClassNotFoundException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    } finally {
    if (zipFile != null) {
    try {
    zipFile.close();
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    }
    }
    }
    });
    contentPane.add(btnRead);

    JButton btnNew = new JButton("新建");
    btnNew.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    if (beSaveFrame != null) {
    beSaveFrame.dispose();
    }

    beSaveFrame = new BeSaveFrame();
    Rectangle bounds = MainFrame.this.getBounds();
    int x = bounds.x + bounds.width;
    int y = bounds.y;
    beSaveFrame.setLocation(x, y);
    beSaveFrame.setVisible(true);
    }
    });
    contentPane.add(btnNew);

    JButton btnWrite = new JButton("写入");
    btnWrite.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    if (beSaveFrame == null || !beSaveFrame.isVisible()) {
    JOptionPane.showMessageDialog(MainFrame.this,
    "没有要写入的窗体。", "提示", JOptionPane.INFORMATION_MESSAGE);
    return;
    }
    // 选择目标文件
    JFileChooser chooser = new JFileChooser();
    chooser.setFileFilter(new FileNameExtensionFilter(
    "ZIP文件(*.zip)", "zip"));
    int action = chooser.showSaveDialog(MainFrame.this);
    if (action != JFileChooser.APPROVE_OPTION) {
    return;
    }
    File file = chooser.getSelectedFile();
    ObjectOutputStream oos = null;
    try {
    // 生成zip输出流
    ZipOutputStream zos = new ZipOutputStream(
    new FileOutputStream(file));
    // 生成新条目
    ZipEntry entry = new ZipEntry("saved.frm");
    // 将新条目写入输出流
    zos.putNextEntry(entry);
    // 生成对象输出流
    oos = new ObjectOutputStream(zos);
    // 将窗体写入输出流
    oos.writeObject(beSaveFrame);
    // 强制输出到文件
    oos.flush();
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    } finally {
    if (oos != null) {
    try {
    oos.close();
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    }
    }
    }
    });
    contentPane.add(btnWrite);

    pack();
    }

    private Point getFrameLoc() {
    Point point = new Point();
    Rectangle bounds = this.getBounds();
    point.x = bounds.x + bounds.width;
    point.y = bounds.y;
    return point;
    }
    }

    被保存的窗体类

    import javax.swing.JFrame;
    import java.awt.BorderLayout;
    import javax.swing.JLabel;
    import javax.swing.JTextArea;
    import java.awt.Dimension;

    /**
     *
     * @author zys59三仙半(QQ:597882752)<br>
     * 创建时间:2015年6月18日 上午12:38:44
     */
    public class BeSaveFrame extends JFrame {
    private static final long serialVersionUID = -2943829196452303501L;
    private JTextArea taUserMsg;

    public BeSaveFrame() {
    setSize(new Dimension(400, 300));
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setTitle("要被保存的窗体");
    setResizable(false);

    getContentPane().setLayout(new BorderLayout(0, 0));

    JLabel lblNewLabel = new JLabel("请输入内容:");
    getContentPane().add(lblNewLabel, BorderLayout.NORTH);

    taUserMsg = new JTextArea();
    getContentPane().add(taUserMsg, BorderLayout.CENTER);
    }

    public JTextArea getTaUserMsg() {
    return taUserMsg;
    }
    }

    保存不了中文java  将当前的窗体对象压缩成zip文件

如何用JAVA把内存里的二进制文件打包成ZIP包

  1. Q
    内存里面有多个文件 有文件名和二进制内容,如何把这些文件一起打成一个ZIP包。并写到指定的位置。
    问题补充:
    pan_java  写的我看过,没问题
    但我想要的是把内存里的多个二进制文件打成一个ZIP包。
    谢谢
  2. A
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    import java.util.zip.ZipOutputStream;
    
    class ZipTest {
    	// 压缩
    	public static void zip(String zipFileName, String inputFile)
    			throws Exception {
    		File f = new File(inputFile);
    		ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
    				zipFileName));
    		zip(out, f, f.getName());
    		System.out.println("zip done");
    		out.close();
    	}
    
    	private static void zip(ZipOutputStream out, File f, String base)
    			throws Exception {
    		out.putNextEntry(new ZipEntry(base));
    		FileInputStream in = new FileInputStream(f);
    		int b;
    		while ((b = in.read()) != -1)
    			out.write(b);
    		in.close();
    	}
    
    	public static void main(String[] args) {
    		try {
    			ZipTest t = new ZipTest();
    			t.zip("c:\\test.zip", "c:\\1.txt");
    		} catch (Exception e) {
    			e.printStackTrace(System.out);
    		}
    
    	}
    }


    将c:\1.txt 打包成 c:\test.zip

java根据模板修改内容后,生成word,修改后内容中文乱码

  1. Q
    Java code
    package com.sunyard.test;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.PrintWriter;
    import java.io.UnsupportedEncodingException;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    public class OperatorRTF {

        /**
         * 字符串转换为rtf编码
         *
         * @param content
         * @return
         */
        public String strToRtf(String content) {

            try {
                System.out.println(content);
                content=new String(content.getBytes(),"GB2312");
                System.out.println(content);
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            char[] digital = "0123456789ABCDEF".toCharArray();
            StringBuffer sb = new StringBuffer("");
            byte[] bs = null;
            bs = content.getBytes();
            int bit;
            for (int i = 0; i < bs.length; i++) {
                bit = (bs[i] & 0x0f0) >> 4;
                sb.append("\\'");
                sb.append(digital[bit]);
                bit = bs[i] & 0x0f;
                sb.append(digital[bit]);
            }
            return sb.toString();
        }

        /**
         * 替换文档的可变部分
         *
         * @param content
         * @param replacecontent
         * @param flag
         * @return
         */
        public String replaceRTF(String content, String replacecontent, int flag) {
            String rc = strToRtf(replacecontent);
            String target = "";
            System.out.println(rc);
            if (flag == 0) {
                target = content.replace("$timetop$", rc);
            }
            if (flag == 1) {
                target = content.replace("$info$", rc);
            }
            if (flag == 2) {
                target = content.replace("$idea$", rc);
            }
            if (flag == 3) {
                target = content.replace("$advice$", rc);
            }
            if (flag == 4) {
                target = content.replace("$infosend$", rc);
            }
            return target;
        }

        /**
         * 获取文件路径
         *
         * @param flag
         * @return
         */
        public String getSavePath() {

            String path = "D:\\";
            File fDirecotry = new File(path);
            if (!fDirecotry.exists()) {
                fDirecotry.mkdirs();
            }
            return path;
        }

        /**
         * 半角转为全角
         */
        public String ToSBC(String input) {
            char[] c = input.toCharArray();
            for (int i = 0; i < c.length; i++) {
                if (c[i] == 32) {
                    c[i] = (char) 12288;
                    continue;
                }
                if (c[i] < 127) {
                    c[i] = (char) (c[i] + 65248);
                }
            }
            return new String(c);
        }

        public void rgModel(String username, String content) {
            /* 构建生成文件名 targetname:12时10分23秒_username_记录.rtf */
            Date current = new Date();

            SimpleDateFormat sdf = new java.text.SimpleDateFormat(
                    "yyyy-MM-dd HH:mm:ss");

            String targetname = sdf.format(current).substring(11, 13) + "时";
            targetname += sdf.format(current).substring(14, 16) + "分";
            targetname += sdf.format(current).substring(17, 19) + "秒";
            targetname += "_" + username + "_记录.doc";
           
            /* 字节形式读取模板文件内容,将结果转为字符串 */
            String strpath = getSavePath();
            String sourname = strpath + "\\" + "档案利用登记单.rtf";
            String sourcecontent = "";
            InputStream ins = null;
            try {
                ins = new FileInputStream(sourname);
                byte[] b = new byte[1024];
                if (ins == null) {
                    System.out.println("源模板文件不存在");
                }
                int bytesRead = 0;
                while (true) {
                    bytesRead = ins.read(b, 0, 1024); // return final read bytes
                    // counts
                    if (bytesRead == -1) {// end of InputStream
                        System.out.println("读取模板文件结束");
                        break;
                    }
                    // convert to string using bytes
                    sourcecontent += new String(b, 0, bytesRead);
                   
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
           
            /* 修改变化部分 */
            String targetcontent = "";
            /**
             * 拆分之后的数组元素与模板中的标识符对应关系 array[0]:timetop array[1]:info array[2]:idea
             * array[3]:advice array[4]:infosend
             */
            String array[] = content.split("~");

            // 2008年11月27日:更新模板之后时间无需自动填充
            for (int i = 0; i < array.length; i++) {
                if (i == 0) {
                    targetcontent = replaceRTF(sourcecontent, array[i], i);
                } else {
                    targetcontent = replaceRTF(targetcontent, array[i], i);
                }
            }
            /* 结果输出保存到文件 */
            try {
                FileWriter fw = new FileWriter(getSavePath() + "\\" + targetname,
                        true);
                PrintWriter out = new PrintWriter(fw);
                System.out.println(targetcontent);
                if (targetcontent.equals("") || targetcontent == "") {
                    out.println(sourcecontent);
                } else {
                    out.println(targetcontent);
                }
                out.close();
                fw.close();
                System.out.println(getSavePath() + "  该目录下生成文件" + targetname
                        + " 成功");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        public static void main(String[] args) {

            OperatorRTF oRTF = new OperatorRTF();

            // 被替换内容以"~"符号分割,处理的时候将其拆分为数组即可
            String content = "2008Y10M12D9H-2008Y10M12D6H~idea~look~我们参照检验药品的方法~we";
            oRTF.rgModel("cheney", content);
        }
    }




    上面的代码是我在网上找到的一种java操作word的方法

    java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用);java2Word、jacob容易报错找不到注册,比较诡异,我曾经在不同的机器上试过,操作方法完全一致,有的机器不报错,有的报错,去他们论坛找高人解决也说不出原因,项目部署用它有点玄;itxt好像写很方便但是我查了好久资料没有见到过关于读的好办法。经过一番选择还是折中点采用rtf最好,毕竟rtf是开源格式,不需要借助任何插件,只需基本IO操作外加编码转换即可。rtf格式文件表面看来和doc没啥区别,都可以用word打开,各种格式都可以设定。

    ----- 实现的功能:读取rtf模板内容(格式和文本内容),替换变化部分,形成新的rtf文档。



    ----- 实现思路:模板中固定部分手动输入,变化的部分用$info$表示,只需替换$info$即可。

          1、采用字节的形式读取rtf模板内容

          2、将可变的内容字符串转为rtf编码

          3、替换原文中的可变部分,形成新的rtf文档

    这是原作者的想法,可我在使用过程中,发现替换内容中(我们参照检验药品的方法)这个中文,是不能显示的,在word里,把它转换成了iso-8859-1的编码了,不能正常显示中文,我都不知道应该在哪设置编码,才能让它正常显示,原word模板中的中文,可以正常显示,应该是在读取word模板的时候,把编码方式也读进去了,现在就是想请教一下前辈们,应该如何后,自己修改的那些中文,也可以正常显示呢
    问题补充:
    汗,这里好象自己不能回复,所以我以这种形式回复。
    先感谢一楼,二楼的回答,昨天我有事,请假没上班,所以没能及时回复,先道个歉。
    先回答1楼的,在写的时候,我设置编码的话,感觉是无效的,不管我怎么设置,都没用。
    再回答2楼的,特别说一下,我试了一下,发现生成的word里,那些修改部分的中文的编码形式改变了,只是还是乱码。后来我把unicode,ISO-8859-1,UTF-8,GB2312,GBK,甚至ASCII都试过了, word里都是不同形式的乱码,就是不出现汉字,真闷,我感觉是在
    bs = content.getBytes("unicode");
    后,系统后来又默认的把这把转成了ISO-8859-1的形式.
    可是
    bs = content.getBytes("ISO-8859-1");
    我这么设置,word里的汉字是?????
    真不知道为什么,要是ISO-8859-1,转ISO-8859-1,应该不会改变的哎
    希望高手们,能继续解答,谢谢

    问题补充:
    汪兆铭,您好,我不知道您一直观注这个问题,我以为要过会才能看到您的回答,所以,现在才刷新了这个页面,不好意思,先道个歉。

    现在回到问题中,我照您的意思,
    bs = content.getBytes("unicode");
    改了一下,然后输入,可是依然不能正常显示中文,是不是,在哪,还需要再转换一次呢?
    问题补充:
    [email protected]
    谢谢,不知道与jdk版本或是什么的没有关系
    问题补充:
    汪兆铭,您好,我看了一下您发的东西,我发现了问题的所在,竟然是在表格单元格里面的,就替换出来的是乱码,在表格单元格外面的,是可以正常显示的,您可以去试试,把替换的那个,放在表格里,看看,会不会成功,谢谢你的帮助
    问题补充:
    谢谢您,给我这么多的帮助,那应该是我的那个rtf模板的问题了,真的很感谢,谢谢,谢谢,再谢谢
  2. A
    strToRtf方法中的这句
    bs = content.getBytes();
    换成

    bs = content.getBytes("unicode");

    这句