Запись и чтение treemap
Встретилась с таким вопросом: Пишу TreeMap < Class , Integer >, где ключами являются объекты класса. У меня есть класс CharasteristicsOfMusic, а в нем конструктор
public class CharasteristicsOfMusic implements Comparable<CharasteristicsOfMusic>{
String anArtist;
String composition;
int year;
public CharasteristicsOfMusic(String anArtist, String composition, int year) {
this.anArtist = anArtist;
this.composition = composition;
this.year = year;
}
@Override
public int compareTo(CharasteristicsOfMusic charasteristicsOfMusic) {
if(charasteristicsOfMusic.getAnArtist()==this.getAnArtist() && charasteristicsOfMusic.getComposition() == this.getComposition()) return 0;
if(charasteristicsOfMusic.getYear()>this.getYear()) return 1;
return -1;
}
}
Само задание состоит в том, чтобы записать из файла/ в файл TreeMap < CharasteristicsOfMusic, Integer> Например, файл
ExArtirs1 ExComposition1 ExYear1 : 1
ExArtirs1 ExComposition1 ExYear1 : 2
ExArtirs1 ExComposition1 ExYear1 : 3
должен распарсится в TreeMap < CharasteristicsOfMusic, Integer> , и наоборот.
Пробовала так:
public void WriteFile( TreeMap<CharasteristicsOfMusic, Integer> map, String filename) throws IOException {
File file = new File(filename);
BufferedWriter bf = new BufferedWriter(new FileWriter(file));
for (Map.Entry<CharasteristicsOfMusic, Integer> entry : map.entrySet()) {
bf.write(entry.getKey() + ":" + entry.getValue());
bf.newLine();
}
}
Но при этом ничего не просходит Подскажите пожалуйста , как это можно решить?
Ответы (2 шт):
В Java каждый открытый ресурс должен быть обязательно закрыт, для того, чтобы запись/чтение отработали как задумано.
В вашем же случае, вы открываете поток записи в файл, кладёте данные в буфер в оперативной памяти, и тут программа завершается, не успев переместить данные на жёсткий диск. Чтобы всё заработало, нужно просто добавить после окончания записи вызов метода close():
public static void writeFile(TreeMap<CharasteristicsOfMusic, Integer> map, String filename) throws IOException {
File file = new File(filename);
BufferedWriter bf = new BufferedWriter(new FileWriter(file));
for (Map.Entry<CharasteristicsOfMusic, Integer> entry : map.entrySet()) {
bf.write(entry.getKey() + ":" + entry.getValue());
bf.newLine();
}
bf.close();
}
Можно обойтись и без явного вызова close(): в Java 7 ввели формат записи, называемый try-with-resources. Тут мы открываем ресурс в круглых скобках, и программа закрывает его автоматически после использования:
public static void writeFile(TreeMap<CharasteristicsOfMusic, Integer> map, String filename) throws IOException {
File file = new File(filename);
try (BufferedWriter bf = new BufferedWriter(new FileWriter(file))) {
for (Map.Entry<CharasteristicsOfMusic, Integer> entry : map.entrySet()) {
bf.write(entry.getKey() + ":" + entry.getValue());
bf.newLine();
}
}
}
С чтением из файла разобралась так, открыта к доработке/ новым идеям.
public void read() throws FileNotFoundException {
String fileName = "infoMusic.txt";
System.out.println("\nLoading contacts into " + fileName + "...");
PrintWriter writer = new PrintWriter(fileName);
for (Map.Entry product : tm.entrySet()) {
System.out.println(product.getKey() + " : " + product.getValue());
writer.println(product.getKey() + ", " + product.getValue());
}
writer.close(); // Important: close the io resource after using it.
}