【发布时间】:2014-04-13 17:09:08
【问题描述】:
我的程序可以不出错地写一个utf-8文件
public static boolean main(Lesson lesson, int autoSave) throws IOException {
final ObjectMapper mapper = new ObjectMapper();
String user = System.getProperty("user.name");
String s = user.format("C:\\Users\\%s\\Documents", user);
s = s.replace("\\", "/");
File dir = new File(String.format(("%s/VocabelTrainer"), s));
dir.mkdir();
String path = String.format("%s/VocabelTrainer/%s", s, lesson.getLessonName());
File file = new File(path);
if(file.exists() == false || autoSave == 1){
mapper.writeValue(new FileWriter(path), lesson);
return true;
}
else
return false;
}
但是当我想读回来时
public class ReadFile {
public static Lesson main(String fileName) throws JsonParseException, JsonMappingException, IOException
{
final ObjectMapper mapper = new ObjectMapper();
Lesson lesson = new Lesson();
String user = System.getProperty("user.name");
String s = String.format("C:\\Users\\%s\\Documents\\VocabelTrainer", user);
s = s.replace("\\", "/");
String path = String.format("%s/%s", s, fileName);
File f = new File(path);
if (f.exists())
lesson = mapper.readValue(new File(path), Lesson.class);
else
System.out.println("File does not exist at " + f.toString());
return lesson;
}
我总是收到这个错误
org.codehaus.jackson.JsonParseException: 无效的 UTF-8 中间字节 0x22 在 [来源:C:\Users\Username\Documents\VocabelTrainer\Filename;行:1,列:31] 在 org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1433) 在 org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:521) 在 org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidOther(Utf8StreamParser.java:2830) 在 org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidOther(Utf8StreamParser.java:2837) 在 org.codehaus.jackson.impl.Utf8StreamParser._decodeUtf8_2(Utf8StreamParser.java:2625) 在 org.codehaus.jackson.impl.Utf8StreamParser._finishString2(Utf8StreamParser.java:1952) 在 org.codehaus.jackson.impl.Utf8StreamParser._finishString(Utf8StreamParser.java:1905) 在 org.codehaus.jackson.impl.Utf8StreamParser.getText(Utf8StreamParser.java:276) 在 org.codehaus.jackson.map.deser.std.StringDeserializer.deserialize(StringDeserializer.java:26) 在 org.codehaus.jackson.map.deser.std.StringDeserializer.deserialize(StringDeserializer.java:13) 在 org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299) 在 org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414) 在 org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697) 在 org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580) 在 org.codehaus.jackson.map.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217) 在 org.codehaus.jackson.map.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:194) 在 org.codehaus.jackson.map.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:30) 在 org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299) 在 org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414) 在 org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697) 在 org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580) 在 org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732) 在 org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1817) 在 vocabeltrainer.file.ReadFile.main(ReadFile.java:26) 在 vocabeltrainer.main.FileNameSwing.getFileNames(FileNameSwing.java:232) 在 vocabeltrainer.main.FileNameSwing.(FileNameSwing.java:44) 在 vocabeltrainer.main.Swing.actionPerformed(Swing.java:87) 在 javax.swing.AbstractButton.fireActionPerformed(未知来源) 在 javax.swing.AbstractButton$Handler.actionPerformed(未知来源) 在 javax.swing.DefaultButtonModel.fireActionPerformed(未知来源) 在 javax.swing.DefaultButtonModel.setPressed(未知来源) 在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知来源) 在 java.awt.Component.processMouseEvent(未知来源) 在 javax.swing.JComponent.processMouseEvent(未知来源) 在 java.awt.Component.processEvent(未知来源) 在 java.awt.Container.processEvent(未知来源) 在 java.awt.Component.dispatchEventImpl(未知来源) 在 java.awt.Container.dispatchEventImpl(未知来源) 在 java.awt.Component.dispatchEvent(未知来源) 在 java.awt.LightweightDispatcher.retargetMouseEvent(未知来源) 在 java.awt.LightweightDispatcher.processMouseEvent(未知来源) 在 java.awt.LightweightDispatcher.dispatchEvent(未知来源) 在 java.awt.Container.dispatchEventImpl(未知来源) 在 java.awt.Window.dispatchEventImpl(未知来源) 在 java.awt.Component.dispatchEvent(未知来源) 在 java.awt.EventQueue.dispatchEventImpl(未知来源) 在 java.awt.EventQueue.access$200(未知来源) 在 java.awt.EventQueue$3.run(未知来源) 在 java.awt.EventQueue$3.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知来源) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知来源) 在 java.awt.EventQueue$4.run(未知来源) 在 java.awt.EventQueue$4.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知来源) 在 java.awt.EventQueue.dispatchEvent(未知来源) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.run(未知来源)
因为他读到了字母“ß”,这是一个 UTF-8 字母!
我阅读了一些严肃的文章,但我没有找到正确的方法来读取 UTF-8。
谢谢
【问题讨论】:
标签: java json encoding utf-8 jackson