如何在Java中保存字符串中的图像文件?

如何在Java中保存字符串中的图像文件?,java,regex,bytearray,Java,Regex,Bytearray,我需要读取一个文件,提取字节并添加标记。然后我必须提取字节并提取标签之间的内容。最后,标签数据将用于制作原始图像的精确副本。。。但我的问题是,图像看起来与原始图像不一样 使用文本文件可以很好地工作,但不使用图像 这是我的java代码。这很容易: public class MyFile { public static void main(String[] args) { try{ /* Read File */ File aFile= new File("

我需要读取一个文件,提取字节并添加
标记。然后我必须提取字节并提取标签之间的内容。最后,标签数据将用于制作原始图像的精确副本。。。但我的问题是,图像看起来与原始图像不一样

使用文本文件可以很好地工作,但不使用图像

这是我的java代码。这很容易:

public class MyFile {


public static void main(String[] args) {

     try{
     /* Read File */
        File aFile= new File("infinito.jpg");
        FileInputStream fis = new FileInputStream(aFile);
        long sizeFichero = aFile.length();

        byte []datos = new byte[(int) sizeFichero];

        fis.read(datos);
        fis.close();

        /* Write copy file */
        File copyFile = new File("infinto_COPY.jpg");
        FileOutputStream fos = new FileOutputStream(copyFile);

        /* Add bytes to array bytes */
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
        outputStream.write("<segment>".getBytes());
        outputStream.write(datos);
        outputStream.write("</segment>".getBytes());

        byte [] bytes = outputStream.toByteArray();

        /* Regular Expression */
        String text = new String(bytes);
        String regexpr = "<segment>(.*?)</segment>";
        Pattern pat = Pattern.compile(regexpr, Pattern.MULTILINE | Pattern.DOTALL);
        Matcher mat = pat.matcher(text);

        /* If find between <segment></segment> then write file */
        if (mat.find()){

            String group1 = mat.group(1);
            fos.write(group1.getBytes());
            fos.close();
        }



        } catch (IOException e) {

            e.printStackTrace();
        }


}

}
公共类MyFile{
公共静态void main(字符串[]args){
试一试{
/*读取文件*/
File aFile=新文件(“infinito.jpg”);
FileInputStream fis=新的FileInputStream(文件);
long-sizeFichero=aFile.length();
字节[]datos=新字节[(int)sizeFichero];
财政司司长(达托斯);
fis.close();
/*写拷贝文件*/
File copyFile=新文件(“infinto_COPY.jpg”);
FileOutputStream fos=新的FileOutputStream(copyFile);
/*将字节添加到数组字节*/
ByteArrayOutputStream outputStream=新建ByteArrayOutputStream();
write(“.getBytes());
outputStream.write(datos);
write(“.getBytes());
byte[]bytes=outputStream.toByteArray();
/*正则表达式*/
字符串文本=新字符串(字节);
字符串regexpr=“(.*?”;
Pattern pat=Pattern.compile(regexpr,Pattern.MULTILINE | Pattern.DOTALL);
Matcher mat=pat.Matcher(文本);
/*如果在两者之间找到,则写入文件*/
if(mat.find()){
字符串组1=材料组(1);
fos.write(group1.getBytes());
fos.close();
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
结果呢。正本和副本:

如何通过分析正则表达式来实现这一点


非常感谢。

我同意@madhav turangi的建议。我在Java 7上尝试了您的代码,并使用base64对二进制数据进行编码/解码

要使代码正常工作,请在导入列表中添加:

import org.apache.commons.codec.binary.Base64;
更改您的线路:

outputStream.write(datos);
fos.write(group1.getBytes());
与:

然后改变你的路线:

outputStream.write(datos);
fos.write(group1.getBytes());
与:


经测试,上述方法有效。

首先,为什么要使用regex?第二,如果XML中有纯文本,这与图像数据不同。您不想首先将其转换为二进制数据吗?Regex基本上用于文本数据,在java中是字符串类型。字符串是一个字符数组,每个字符由两个字节组成。将文本和字节数据的混合作为一个输入单元提供给正则表达式引擎(IMHO)不是一个好主意,因为引擎尝试读取一系列
char
s.
“string”。getBytes()
新字符串(字节)
使用默认的平台编码,这可能与将JPEG的字节视为字符串不兼容。例如,JPEG通常(并非总是)以
ff d8 ff e0
开头,这将作为UTF-8完全无效。始终使用采用显式编码的
getBytes
String
ctor的覆盖,并停止尝试将二进制图像文件视为文本。另一种替代方法可能是使用Base64编码和解码,我没有使用它们,但这似乎是一个可行的解决方案。从文件中读取字节数组,并将其编码为字符串,然后用
标记将其包装。将此字符串与正则表达式一起使用可提取标记之间的内容。然后Base64解码回字节数组。请尝试org.apache.commons.codec.binary.Base64或从java 8 java.util.Base64。如果谷歌到处搜索,会有很多例子。谢谢大家。Base64救了我^^非常感谢你。这正是我所需要的。很抱歉延迟回复。