Задать вопрос
@cattom72
Врач анестезиолог-реаниматолог. Караганда.

Как решить проблему с кодировкой при выводе текста в файл из программы на Java?

Здравствуйте!
Подскажите, пожалуйста, как решить следующую проблему. Программа для учета трансфузионных сред и оформления разных протоколов при их использовании (написана на Java) берет строки из текстового файла (текст-шаблон в кодировке UTF-8), дополняет их данными и выводит в другой текстовый файл. Программа написана в Eclipse (кодировка UTF-8). В самой среде Eclipse программа отрабатывает без проблем: создается именованный текстовый файл с правильно подставленными данными. Но при создании "runnable jar file" (и я подозреваю, что экзешник тоже так себя будет вести) программа запускается, но данные не добавляются, и выводится в файл только исходный шаблон, без расчетных данных! Только если текст-шаблон имеет кодировку ANSI, то программа отрабатывает на ура. Но есть одно "но": часть текста-шаблона имеет казахские буквы, и они тогда выводятся неправильно....
На всякий случай привожу часть кода (предупреждаю, что я не профессиональный программист, а врач, так что сильно не смейтесь, если что не так))):
spoiler
public static void printEritr(){
		if (!dir_Blooder.exists())
			dir_Blooder.mkdir();
		if (!dir_Base.exists())
			dir_Base.mkdir();

		File fileWriteIn = new File("C:/Users/Public/Blooder/Base/transit.txt");
		File fileReadOut = new File("C:/Users/Public/Blooder/Docs/formEritr.txt");
		String line = "";
		
		try {
			FileReader fileRead = new FileReader(fileReadOut);
			BufferedReader buffReader = new BufferedReader(fileRead); 
			FileWriter fileWrit = new FileWriter(fileWriteIn);
			BufferedWriter buffWriter = new BufferedWriter(fileWrit);
			
			while ((line = buffReader.readLine()) != null) { 
				if (line.contains("Ф.И.О. больного")) line += "  " + name.toUpperCase();
				if (line.contains("Дата рождения")) line += "  " + Blood_Patient.comboDay[0].getSelectedItem() + " " 
				                                            + Blood_Patient.comboMonth[0].getSelectedItem() 
				                                            + " " + Blood_Patient.comboYear[0].getSelectedItem() + " года.";
				if (line.contains("Дата проведения трансфузии")) {
					line += "  " + Blood_Patient.comboDay[1].getSelectedItem()+ " " + Blood_Patient.comboMonth[1].getSelectedItem() 
                            + " " + Blood_Patient.comboYear[1].getSelectedItem() + " года.";
					buffWriter.write(line); 
					buffWriter.newLine();
					continue;
				}
						                                                 
				if (line.contains("начата")) line = "   басталды (начата):  " + Blood_Patient.startHour + /*Blood_Patient.comboHour.getSelectedItem() +*/  " сағат (час)  " 
						                            + Blood_Patient.startMinutes /*Blood_Patient.comboMinute.getSelectedItem()*/ + " минут (минута)";
				if (line.contains("окончена")) line = "   аяқталды (окончена):  " + Blood_Patient.endHour + " сағат (час)  " + Blood_Patient.endMinutes + " минут (минута)"; 
				if (line.contains("Группа крови и резус-принадлежность больного")) {
					buffWriter.write(line); 
					buffWriter.newLine();
					buffWriter.write(Blood_Patient.comboGroup.getSelectedItem() + "");
					buffWriter.newLine(); buffWriter.newLine();
					continue;
				}
				if (line.contains("Отделение больницы")) line += "  " + Blood_Patient.valDepart.toUpperCase();
				if (line.contains("истории болезни")) line += "  " + Blood_Patient.tf_NumOfCase.getText();
				if (line.contains("До трансфузии")) line = "Трансфузияға дейін (До трансфузии): АҚ (АД) " + Blood_Patient.indexOfLife[0][0] + " и " 
						                                   + Blood_Patient.indexOfLife[0][1] + " мм рт. ст," +  " Ps " + Blood_Patient.indexOfLife[0][2] 
						                                   + " в минуту," +  "T тела " + Blood_Patient.indexOfLife[0][3];
				if (line.contains("Трансфузионный анамнез")) line += "  " + Blood_Patient.valAnamnes.toUpperCase();
				if (line.contains("Показания к трансфузии")) line += "  " + Blood_Patient.comboDiagnose.getSelectedItem();
				if (line.contains("Наименование трансфузионной среды")) {
					buffWriter.write(line); 
					buffWriter.newLine();
					buffWriter.write("Э Р И Т Р О Ц И Т Н А Я   В З В Е С Ь");
					buffWriter.newLine(); buffWriter.newLine();
					continue;
				}
				if (line.contains("Группа крови и резус-принадлежность донора")) {
					buffWriter.write(line); 
					buffWriter.newLine();
					if (Blood_Preparat.groupOfDonor.contains("полож"))
					    buffWriter.write(Blood_Preparat.groupOfDonor.replace(".", "ительный") + "");
					else buffWriter.write(Blood_Preparat.groupOfDonor.replace(".", "ательный") + "");
					buffWriter.newLine(); buffWriter.newLine();
					continue;
				}
				if (line.contains("Номер этикетки трансфузионной среды")) line += "  " + Blood_Preparat.tf_Code.getText();
				if (line.contains("Наименование организации")) {
					buffWriter.write(line); 
					buffWriter.newLine();
					buffWriter.write("К А Р А Г А Н Д И Н С К И Й    О Б Л А С Т Н О Й    Ц Е Н Т Р    К Р О В И");
					buffWriter.newLine(); buffWriter.newLine();
					continue;
				}
				if (line.contains("Дата заготовки")) line += "  " + "09 сентября 1972 года";
				if (line.contains("по группе крови")) line += "  " + "С О В М Е С Т И М А";
				if (line.contains("по резус-фактору")) line += "  " + "С О В М Е С Т И М А";
				if (line.contains("проводившего пробы")) line += "  " + Blood_Patient.nameOfDoctor;
				if (line.contains("биологическая проба")) line += "  " + "С О В М Е С Т И М А";
				if (line.contains("Перелито")) line = "Құйылған (Перелито):  " + Blood_Preparat.listPrep.getSelectedValue() + " миллилитр (мл)";
				if (line.contains("капельно-струйно – нужное подчеркнуть")) line += "  " + Blood_Patient.valInjection.toUpperCase();
				if (line.contains("Реакции")) line += "  " + Blood_Patient.valComplication.toUpperCase();
				if (line.contains("Предпринятые меры")) line += "  " + Blood_Patient.valMeasures.toUpperCase();
				if (line.contains("проводившего трансфузию")) {
					buffWriter.write(line); 
					buffWriter.newLine();
					buffWriter.write("  " + Blood_Patient.nameOfDoctor);
					buffWriter.newLine(); buffWriter.newLine();
					continue;
				}
				if (line.contains("После трансфузии")) line = "Трансфузиядан кейін (После трансфузии): АҚ (АД) " + Blood_Patient.indexOfLife[1][0] + " и " 
						                                   + Blood_Patient.indexOfLife[1][1] + " мм рт. ст," +  " Ps " + Blood_Patient.indexOfLife[1][2] 
						                                   + " в минуту," +  "T тела " + Blood_Patient.indexOfLife[1][3];
				if (line.contains("через 1 час")) line = "1 сағаттан кейін (через 1 час): АҚ (АД) " + Blood_Patient.indexOfLife[2][0] + " и " 
						                                   + Blood_Patient.indexOfLife[2][1] + " мм рт. ст," +  " Ps " + Blood_Patient.indexOfLife[2][2] 
						                                   + " в минуту," +  "T тела " + Blood_Patient.indexOfLife[2][3];
				if (line.contains("через 2 часа")) line = "2 сағаттан кейін (через 2 часа): АҚ (АД) " + Blood_Patient.indexOfLife[3][0] + " и " 
						                                   + Blood_Patient.indexOfLife[3][1] + " мм рт. ст," +  " Ps " + Blood_Patient.indexOfLife[3][2] 
						                                   + " в минуту," +  "T тела " + Blood_Patient.indexOfLife[3][3];
				if (line.contains("через 3 часа")) line = "3 сағаттан кейін (через 3 часа): АҚ (АД) " + Blood_Patient.indexOfLife[4][0] + " и " 
						                                   + Blood_Patient.indexOfLife[4][1] + " мм рт. ст," +  " Ps " + Blood_Patient.indexOfLife[4][2] 
						                                   + " в минуту," +  "T тела " + Blood_Patient.indexOfLife[4][3];
				if (line.contains("Цвет")) line += "  светло-желтая";
				if (line.contains("Суточный диурез")) line += "  " + Blood_Patient.valDiurez + " мл";
				if (line.contains("медсестры")) line += "  Петровская А.Г.";
				if (line.contains("дата, время")) line += "  " + Blood_Patient.comboDay[1].getSelectedItem() + " " + Blood_Patient.comboMonth[1].getSelectedItem()+ " " 
				                                               + Blood_Patient.comboYear[1].getSelectedItem() + " года, " + Blood_Patient.comboHour.getSelectedItem() 
				                                               + ":" + Blood_Patient.comboMinute.getSelectedItem();
				buffWriter.write(line); 
				buffWriter.newLine(); 
				//buffWriter.newLine();
			}
			buffReader.close();
			buffWriter.close();
						
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		
		Calendar dating = Calendar.getInstance(); 
	    SimpleDateFormat formating = new SimpleDateFormat("YYYY-MM-dd, HH-mm-ss");
	    String timeOfFile = formating.format(dating.getTime()) ;	 
	
		      
			   File fileSave = new File("C:/Users/Public/Blooder/Base/" + name);
				if (!fileSave.exists())
					fileSave.mkdir();
				//File fileInBase = new File("C:/Users/Public/Blooder/Base/" + name +"/" + name + "_" + date.getYear()+ "_" + date.getMonthValue() + "_" + date.getDayOfMonth() + ".txt");
				   fileWriteIn.renameTo(new File("C:/Users/Public/Blooder/Base/" + name +"/" + name + "_" + timeOfFile + ".txt"));
			   if (Desktop.isDesktopSupported())
					desktop = Desktop.getDesktop();
				if (desktop.isSupported(Desktop.Action.EDIT))
					try {
						desktop.edit(new File("C:/Users/Public/Blooder/Base/" + name +"/"+ name + "_" + timeOfFile + ".txt"));
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					};

  • Вопрос задан
  • 847 просмотров
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Попробуйте явно указать кодировку при открытии файла
BufferedReader in = new BufferedReader(
  new InputStreamReader(
    new FileInputStream(fileReadOut),
    "UTF8"
  )
);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы