如何在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救了我^^非常感谢你。这正是我所需要的。很抱歉延迟回复。