Вот переписанный код на Java:
import java.io.*;
import java.net.*;
import java.nio.file.*;
import java.text.*;
import java.util.*;
import org.json.*;
public class TickerDataExporter {
private static String Ticker;
private static Date StartDate, EndDate;
private static String SavePath;
// Построение URL для API
private static String buildApiUrl(String ticker) {
return String.format(«ru-ticker.com/api/clusters/getRange?ticker=%s&period=1&priceStep=1», ticker);
}
// Преобразование даты из формата GGMMDD
private static Date parseDateGGMMDD(String dateStr) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(«yyMMdd»);
return sdf.parse(dateStr);
}
// Сохранение данных в файл
private static void saveDailyData(Date targetDate, String responseData) throws IOException, JSONException {
String fileName = SavePath + Ticker + new SimpleDateFormat(«yyMMdd»).format(targetDate) + ".csv";
System.out.println(«Создание файла: » + fileName);
try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
JSONObject jsonRoot = new JSONObject(responseData);
if (!jsonRoot.has(«clusterData»)) return;
JSONArray jsonArray = jsonRoot.getJSONArray(«clusterData»);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject item = jsonArray.getJSONObject(i);
String dateTimeStr = new SimpleDateFormat(«yyMMddHHmmss»).format(new Date(item.getLong(«x»)));
double qDiff = item.getDouble(«q») — item.getDouble(«bq»);
writer.write(String.format("%s;%.3f;%d%n", dateTimeStr, item.getDouble(«c»), Math.round(qDiff)));
}
}
}
// Обработка данных для конкретной даты
private static void processDate(Date targetDate) throws IOException {
String url = buildApiUrl(Ticker) + "&startDate=" + new SimpleDateFormat(«yyyy-MM-dd»).format(targetDate) + «T00:00:00.000Z» +
"&endDate=" + new SimpleDateFormat(«yyyy-MM-dd»).format(new Date(targetDate.getTime() + 86400000L)) + «T00:00:00.000Z» +
"&candlesOnly=true";
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod(«GET»);
int responseCode = connection.getResponseCode();
if (responseCode == 200) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
StringBuilder responseContent = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
responseContent.append(line);
}
saveDailyData(targetDate, responseContent.toString());
System.out.println(«Данные за » + new SimpleDateFormat(«dd.MM.yyyy»).format(targetDate) + " сохранены");
}
} else {
System.out.println(«Ошибка » + responseCode + " для " + new SimpleDateFormat(«dd.MM.yyyy»).format(targetDate));
}
}
// Главная логика
public static void run(String[] args) {
if (args.length != 4) {
System.out.println(«Использование:»);
System.out.println(" TickerExport.exe <тикер> <ГГММДД_начала> <ГГММДД_окончания> <папка_сохранения>");
System.out.println(«Пример:»);
System.out.println(" TickerExport.exe ETHUSD 250401 250403 C:\\Data");
return;
}
try {
Ticker = args[0].toUpperCase();
StartDate = parseDateGGMMDD(args[1]);
EndDate = parseDateGGMMDD(args[2]);
SavePath = args[3] + File.separator;
// Создаем папку, если ее нет
Files.createDirectories(Paths.get(SavePath));
Calendar currentDate = Calendar.getInstance();
currentDate.setTime(StartDate);
while (!currentDate.getTime().after(EndDate)) {
processDate(currentDate.getTime());
currentDate.add(Calendar.DAY_OF_YEAR, 1);
}
long daysBetween = (EndDate.getTime() — StartDate.getTime()) / (1000 * 60 * 60 * 24) + 1;
System.out.println(«Экспорт завершен. Сохранено файлов: » + daysBetween);
} catch (Exception e) {
System.out.println(«Ошибка: » + e.getMessage());
}
}
// Точка входа
public static void main(String[] args) {
run(args);
}
}
Пояснения:
Работа с датами:
В Delphi используется TDateTime для работы с датами. В Java я использую Date и Calendar, чтобы манипулировать датами.
Для форматирования и парсинга дат я использую SimpleDateFormat.
HTTP-запросы:
В Delphi для отправки HTTP-запросов используется THTTPClient, а в Java я использую HttpURLConnection.
JSON-парсинг:
В Delphi для работы с JSON используется System.JSON, в Java я использую библиотеку org.json, чтобы парсить и извлекать данные.
Запись в файл:
В Delphi для записи используется AssignFile и WriteLn, а в Java я использую BufferedWriter.
Папки и файлы:
В Java для создания директорий я использую Files.createDirectories(), чтобы гарантировать наличие папки.